PTA 简单动态规划 楼层仍鸡蛋问题

M个软硬程度一样但软硬程度未知的鸡蛋,它们有可能都在第一层楼就摔碎,也可能从一千层楼摔下来没事。有座N层的建筑,要你用这M个鸡蛋确定哪一层是鸡蛋可以安全落下的最高层数。可以摔碎这M个鸡蛋,但碎了就不能再拿来测试了,没碎的可以重复仍。楼层高度地面为0层。你的任务是求出,保证在最坏情况下(因为比如只有一个鸡蛋,只好从低往高仍,否则破了就不能准确求问题的解),也可以求出问题的解的最少仍鸡蛋次数。比如: 1个鸡蛋 n层楼,最坏情况最少要扔n次。100层楼 2个鸡蛋  最坏情况最少要14次。摘自算法第4版课后练习。 google面试题。

输入格式:
第一行给出组数N,后面的每一行为 鸡蛋数M ,楼层数K。 N,M,K 都是正整数, 且都不大于1000。

输出格式:
每行依次输出每组输入的最小仍鸡蛋次数。

输入样例:
在这里给出一组输入。例如:

3
2 100
1 10
10 100
输出样例:
在这里给出相应的输出。例如:

14
10
7

#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 1e9 + 5;
int dp[1001][1001] = { 0 };
int main() {
	int T, M, K;
	cin >> T ;
	while (T--) {
		cin >> M >> K;
		for (int i = 1; i <= K; i++)
			dp[i][1] = i;
		for (int j = 1; j <= M; j++)
			dp[1][j] = 1;
		for(int i=1;i<=K;i++)
			for (int j = 2; j <= M; j++) {
				dp[i][j] =INF;
				for (int k = 1; k <= i; k++)
					dp[i][j] = min(dp[i][j], 1 + max(dp[k - 1][j - 1],dp[i - k][j]));				
			}
		cout << dp[K][M] << endl;
	}
}
发布了23 篇原创文章 · 获赞 31 · 访问量 1105

猜你喜欢

转载自blog.csdn.net/weixin_45333771/article/details/103630920