Chernobyl’ Eagle on a Roof URAL - 1223[递推dp]
题目:有n个鸡蛋,m层的楼房,假设所有鸡蛋的坚硬程度都是一样的,要做实验确定楼层E,在楼层E扔下一个鸡蛋鸡蛋没碎,在E+1或者更高的楼层扔下一个鸡蛋,鸡蛋就会碎,假设一个鸡蛋没有碎,就会用到下一次实验,求最坏情况下的最少实验次数,就能确定E的;
题解:最坏情况下的最小值,
表示有
个鸡蛋,
层楼的最坏情况下的最少实验次数,状态转移方程如下:
具体解释:枚举楼层
,如果实验鸡蛋碎了,那么就用
个鸡蛋去进行
层实验的最坏情况+1;否则,那么就用
个鸡蛋去进行
层实验的最坏情况+1;
代码:
#include
#include
#define ll long long
using namespace std;
const int maxn = 1e3+7;int n, f, dp[maxn][maxn];int main() {#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);long _begin_time = clock();#endifwhile(~scanf("%d%d", &n, &f)){memset(dp, 0, sizeof(dp));if(n == 0&&f == 0) break;int c = ceil(log2(f+1));if(n>=c) {printf("%d\n", c);continue;} for(int i = 1; i <= f; i++) dp[1][i] = i;for(int i = 2; i <= n; i++) {for(int j = 1; j <= f; j++) {dp[i][j] = dp[i-1][j-1] + 1;for(int k = 1; k < j; k++) {dp[i][j] = min(dp[i][j], max(dp[i-1][k-1], dp[i][j-k]) + 1);}}}printf("%d\n", dp[n][f]);}#ifndef ONLINE_JUDGElong _end_time = clock();//printf("time = %ld ms\n", _end_time - _begin_time);#endifreturn 0 ;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
