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;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章