题目描述
题目分析
对于本题我们可以使用动态规划来分析
dp[i][j]代表剩余i层,j台手机的情况下对应的测试数量
分类进行讨论一下:
1.当只剩下一台手机的时候,只能从第一层一层一层往上尝试,尝试到第几层摔坏就是几
2.当j = 2,假设剩余k层,总层数为n,dp[k][2]可以分为以下两种情况:
①摔坏 dp[k][2] = dp[k - 1][1];
②没摔坏 dp[k][2] = dp[n - k][2] //n - k相当于把下面的k层全部砍掉
当j = 3同理
由于考虑的是最坏的情况,所以我们需要在手机摔坏和没摔坏这两种情况中取到最大的测试次数,由于我们要考虑最坏的最优情况,所以我们要在每层最大的里面选择最小的
cpp
#include<bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10;
int dp[N][N];
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int l = 1, r = 1000;
for(int i = 1; i <= 1000; i ++)dp[i][1] = i;//第一部手机
for(int j = 2; j <= 3; j ++)//第二和第三部手机
{
for(int i = 1; i <= 1000; i ++)
{
dp[i][j] = 1e9 + 10;
for(int k = 1; k <= i; k ++)//手机在第k层是否摔坏
{
dp[i][j] = min(max(dp[k - 1][j - 1], dp[i - k][j]) + 1, dp[i][j]);
}
}
}
cout << dp[1000][3];
return 0;
}