1 条题解

  • 0
    @ 2025-10-8 17:05:14

    鸡蛋掉落问题的动态规划解法

    #include<bits/stdc++.h>
    using namespace std;
    int f[12][1100];
    /*
    f[i][j]表示拿 i 个蛋测试 j 层楼需要的最少次数 
    枚举k for(1~j) 表示最后测试的楼层 
    此时有两种情况 
    1.这一层(k)蛋碎了,则 k~j 楼不用测试,等同于我们用 i-1 个蛋来测试 k-1 层楼 
    2.这一层(k)蛋没碎,则 1~k 楼不用测试,等同于我们用 i   个蛋来测试 j-k 层楼 
    我们要把这两种情况下最多的步数作为答案 
    所以dp转移方程为 f[i][j]=max(f[i-1][k-1],f[i-1][j-k])+1; 
    */
    int main()
    {
    	memset(f,63,sizeof(f));
    	for(int i=1;i<=10;i++)f[i][0]=0;//0层楼特判 
    	for(int i=1;i<=10;i++)f[i][1]=1;//1层楼特判 
    	for(int i=1;i<=1000;i++)f[1][i]=i;//1个鸡蛋特判 
    	for(int i=2;i<=10;i++)
    	{
    		for(int j=2;j<=1000;j++)
    		{
    			for(int k=1;k<=j;k++)//k是最后的测试楼层 
    			{
    				f[i][j]=min(f[i][j],max(f[i-1][k-1],f[i][j-k])+1);
    				/*
    				为什么有个min、max 
    				max是最坏情况,因为你特倒霉,实际测试会朝最坏情况的方向走 
    				min是什么? 
    				你用 i 个蛋,测 j 层楼,最后一次实验了,你要选一层楼对吧 
    				你有选择权了!肯定选最好的方案啦 
    				想想看(举栗子) 
    				一个 SB 免费选一张10元、一张50元、一张100元,他或许只拿了10元的 
    				一个聪明人免费选一张1元、一张5元、一张10元, 要拿就全拿呗 
    				10<16
    				看!即使聪明人的处境糟糕,他也可以通过选择策略来谋取幸福生活 
    				那你dp就取最小值呗,有机会不把握,zz 
    				*/
    			}
    		}
    	}
    	int n,k;
    	while(scanf("%d%d",&n,&k)!=EOF)
    	{
    		if(n>10)n=10;
    		/*
    		因为你鸡蛋太多,但楼层有限(k<=1000) 
    		所以你可以不考虑鸡蛋的损耗 
    		大大方方的丢鸡蛋就好,别怂 
    		所以你每次都可以二分法来判定一半的楼层 
    		2的10次方>1000
    		所以鸡蛋多了也没用,还不如拿去XX 
    		*/
    		printf("%d\n",f[n][k]);
    	}
    	return 0;
    }
    
    • 1

    *【动态规划:状态设计DP(难度:7)】鹰蛋实验[scy]

    信息

    ID
    3558
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    5
    已通过
    3
    上传者