image.png
    image.png
    这题面试大概率能遇上,直接上最优解吧。


    这道题最优解的特点在于它是反过来理解提干的:原问题是N层楼K个棋子最少扔多少次,现在反过来看,如果有K个棋子,能扔M次,能搞定多少层楼。

    row:次数;
    col:棋子数
    0 1 2 3 4 5 6 7 8 9 10
    1 0 1 2 3 4 5 6 7 8 9 10
    2 0 1 3 6 10 15 21 28 36 45 55
    3 0 1 3 7 14 25 41 63 92 129 175
    4 0 1 3 7 15 30 56 98 162 255 385
    5 0 1 3 7 15 31 62 119 218 381 637

    image.png
    image.png
    实现推理表:

    1. int superEggDrop(int K, int N){
    2. if(K<1||N<1){
    3. return 0;
    4. }
    5. int binSearchK=log(N);
    6. if(K>binSearchK+1){
    7. return binSearchK;
    8. }
    9. vector<vector<int>> dp(K+1,vector<int>(N+1,0));
    10. for(int i=1;i<=K;++i){
    11. dp[i][1]=1; //第一列全为1
    12. }
    13. for(int j=2;j<=N;++j){
    14. for(int i=1;i<=K;++i){
    15. dp[i][j]=dp[i][j-1]+dp[i-1][j-1]+1;
    16. if(dp[i][j]>=N){
    17. return j;
    18. }
    19. }
    20. }
    21. return 0;
    22. }
    1. int log(int n){
    2. int ret=0;
    3. while(n>0){
    4. ret++;
    5. n=n/2;
    6. }
    7. return ret;
    8. }