/*
如果有i楼j个球,当球从N楼丢下,那么就有两种可能,一是碎了,就有dp[N][j-1],
二是不碎,就有dp[i-N][j],取最坏情况,就是最大值。N从1 开始直到i-1;就可以找到最少要多少步;
dp[i][j] = min(dp[i][j], max(dp[i-n][j], dp[n][j-1]);
这个公式中min对应是上文中的“最少”, max对应的是"最大“;
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[1111][55];
int n=1000, m=50;
int main () {
int i,j,k,temp,id,t;
for(i=0; i<=1000; ++i) for(j=0; j<=50; ++j) dp[i][j] = 200;
for(i=1; i<=m; ++i){
dp[1][i] = 0;
}
for(i=2; i<=n; ++i){
dp[i][1] = i-1;
}
for(i=2; i<=n; ++i){
for(j=2; j<=m; ++j){
temp = 100;
for(k=1; k<i; ++k){
temp = min(temp, max(dp[i-k][j], dp[k][j-1]) );
}
dp[i][j] = min(dp[i][j], temp+1);
}
}
scanf ("%d", &t);
while (t--) {
scanf ("%d%d%d", &id, &m, &n);
printf ("%d %d\n", id, dp[n][m]);
}
}
POJ 3783 (DP, 动态规化)
最新推荐文章于 2020-10-31 21:00:32 发布