c++ LintCode刷题记录之584.丢鸡蛋

本文探讨了一个经典的算法问题——如何使用有限数量的鸡蛋找出一栋n层大楼中会使鸡蛋破碎的最低楼层,采用动态规划方法求解最坏情况下的最小试验次数。通过定义状态转移方程,实现了一个高效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述
有一个n层的建筑。如果一个鸡蛋从第k层及以上落下,它会碎掉。如果从低于这一层的任意层落下,都不会碎。
有m个鸡蛋,用最坏的情况下实验次数最少的方法去找到k, 返回最坏情况下所需的实验次数。

我们考虑f(n,k)是n层楼k个鸡蛋的答案,枚举在第i层(1≤i≤n)丢鸡蛋,如果第i层碎了: 就还剩k-1个鸡蛋,要用k-1个鸡蛋测1~(i-1)层楼,如果没碎,就要用k个鸡蛋测n-i层楼,所以f(n,k)=min(f(n,k),max(f(n-i,k),f(i-1,k-1))+1)

class Solution {
public:
    /**
     * @param m: the number of eggs
     * @param n: the number of floors
     * @return: the number of drops in the worst case
     */
const static int inf=1e9+5;
int f[2005][2005];
int dropEggs2(int m, int n)
{
    // write your code here
    //f(n,k)=min(f(n,k),max(f(n-i,k),f(i-1,k-1))+1)
    for(int i=1;i<=n;i++) f[i][1]=i,f[1][i]=1;
    f[0][0]=0,f[1][1]=1;
    for(int i=2; i<=n; i++)
    {
        for(int k=2; k<=m; k++)
        {
            f[i][k]=inf;
            for(int j=1; j<i; j++)
            {
                f[i][k]=min(f[i][k],max(f[i-j][k],f[j-1][k-1])+1);
                //cout<<i<<" "<<k<<" "<<f[i][k]<<endl;system("pause");
            }
        }
    }

    return f[n][m];
}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值