leetcode-887. 鸡蛋掉落(DP)

题目链接

题面:

 leetcode-887. 鸡蛋掉落(DP)

题解:

解法一:

#include<algorithm>
using namespace std;
class Solution {
    //dp[i][j] i个鸡蛋测试j层高的楼需要的最少测试次数
    int dp[110][10100];
    //则有dp[i][j]=min( 1+max(dp[i-1][k-1],dp[i][j-k]) k in [1,j])
    //从第k层楼扔下一个鸡蛋
    //如果破了,手里有i-1个鸡蛋,测试k-1层楼
    //如果没破,手里有i个鸡蛋,测试j-k层楼
    //时间复杂度O(k*n*n)
public:
    int superEggDrop(int k, int n) {
        //最坏步数
        for(int i=0;i<=k;i++)
        {
            for(int j=0;j<=n;j++)
                dp[i][j]=j;
        }
        for(int i=1;i<=k;i++)
        {
            for(int j=1;j<=n;j++)
            {
                for(int tmp=1;tmp<=j;tmp++)
                {
                    //如果还剩0个鸡蛋,则只能测试0层
                    if(i-1>0||tmp-1==0)
                        dp[i][j]=min(dp[i][j],1+max(dp[i-1][tmp-1],dp[i][j-tmp]));
                }
                    
            }
        }
        return dp[k][n];
    }
};

解法二:

#include<algorithm>
using namespace std;
class Solution {
    //dp[i][j] i个鸡蛋测试j次最高可以测试dp[i][j]层楼高
    //在i个鸡蛋dp[i][j]楼高的情况下,最少需要j次才可以找到f的确切的值
    //若楼更高或者鸡蛋更少,则需要更多的测试次数
    //因为在最坏的情况下,1个鸡蛋测试n次则可以测试出n层楼,则最多不超过n次
    int dp[110][10100];
    //则有dp[i][j]=dp[i-1][j-1]+dp[i][j-1]+1
    //dp[i-1][j-1] i-1个鸡蛋测j-1次
    //dp[i][j-1] i个鸡蛋测j-1次
    //+1表示本次测试测出一层楼高度

    //假设现在楼高dp[i][j]
    //进行第一次测试,在第x层
    //如果摔破了,则还可以测dp[i-1][j-1]
    //如果没摔破,则还可以测dp[i][j-1]
    //我们不关心x是在哪一层,但是我们知道,在x层扔可以取得最优解dp[i][j]
    //初始值
    //dp[i][1]=1
    //dp[1][j]=j
    //时间复杂度O(k*n)
public:
    int superEggDrop(int k, int n) {
        for(int i=1;i<=k;i++)
            dp[i][1]=1;
        for(int j=1;j<=n;j++)
            dp[1][j]=j;
        for(int i=2;i<=k;i++)
        {
            for(int j=2;j<=n;j++)
            {
                //会爆掉int
                dp[i][j]=min(n,dp[i-1][j-1]+dp[i][j-1]+1);
            }
                
        }
        for(int j=0;j<=n;j++)
            if(dp[k][j]>=n) return j;
        return 0;
    }
};

上一篇:我发明了一款 永动机


下一篇:【leetcode】四数之和 c++ python