classSolution{public:intsuperEggDrop(intk,intn){// dp[k][n] := min # of moves to know f with k eggs and n floorsdp.resize(k+1,vector<int>(n+1,-1));returndrop(k,n);}private:vector<vector<int>>dp;intdrop(intk,intn){if(k==0)// No eggs -> donereturn0;if(k==1)// One egg -> drop from 1-th floor to n-th floorreturnn;if(n==0)// No floor -> donereturn0;if(n==1)// One floor -> drop from that floorreturn1;if(dp[k][n]!=-1)returndp[k][n];dp[k][n]=INT_MAX;for(inti=1;i<=n;++i){constintbroken=drop(k-1,i-1);constintunbroken=drop(k,n-i);dp[k][n]=min(dp[k][n],1+max(broken,unbroken));}returndp[k][n];}};
classSolution{publicintsuperEggDrop(intk,intn){// dp[k][n] := min # of moves to know f with k eggs and n floorsdp=newint[k+1][n+1];Arrays.stream(dp).forEach(row->Arrays.fill(row,-1));returndrop(k,n);}privateint[][]dp;privateintdrop(intk,intn){if(k==0)// No eggs -> donereturn0;if(k==1)// One egg -> drop from 1-th floor to n-th floorreturnn;if(n==0)// No floor -> donereturn0;if(n==1)// One floor -> drop from that floorreturn1;if(dp[k][n]!=-1)returndp[k][n];dp[k][n]=Integer.MAX_VALUE;for(inti=1;i<=n;++i){finalintbroken=drop(k-1,i-1);finalintunbroken=drop(k,n-i);dp[k][n]=Math.min(dp[k][n],1+Math.max(broken,unbroken));}returndp[k][n];}}
classSolution{public:intsuperEggDrop(intk,intn){// dp[k][n] := min # of moves to know f with k eggs and n floorsdp.resize(k+1,vector<int>(n+1,-1));returndrop(k,n);}private:vector<vector<int>>dp;intdrop(intk,intn){if(k==0)// No eggs -> donereturn0;if(k==1)// One egg -> drop from 1-th floor to n-th floorreturnn;if(n==0)// No floor -> donereturn0;if(n==1)// One floor -> drop from that floorreturn1;if(dp[k][n]!=-1)returndp[k][n];// broken[i] := drop(k - 1, i - 1) is increasing w/ i// unbroken[i] := drop(k, n - i) is decreasing w/ i// dp[k][n] := 1 + min(max(broken[i], unbroken[i])), 1 <= i <= n// Find the first index i s.t broken[i] >= unbroken[i],// Which minimizes max(broken[i], unbroken[i])intl=1;intr=n+1;while(l<r){constintm=(l+r)/2;constintbroken=drop(k-1,m-1);constintunbroken=drop(k,n-m);if(broken>=unbroken)r=m;elsel=m+1;}returndp[k][n]=1+drop(k-1,l-1);}};