#include <iostream>
using namespace std;
#define N 500
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
int dp[2][N]; /* dp[i][j] 表示用i个鸡蛋测试第 j 层楼所需要的最小步数 */
void count ( int n )
{
int i, j;
/* dp[1][i] = i 已经是最优解,是准确值。而dp[2][i] = i只是用最差解预处理 */
for ( i = 0; i <= n; i++ )
dp[1][i] = dp[2][i] = i;
/* 对于每个楼层i,可以从[1,i-1]层中任选一层抛j第一个鸡蛋:鸡蛋可能破了,那么必须挨个尝试[1,j-1],即dp[1][j-1],鸡蛋可能没破,那么处理[j+1,i],即dp[2][i-j]。每次抛都考虑最坏情况,即max(dp[1][j-1],dp[2][i-j])。枚举所有[1,i-1]的楼层,取最优解 */
for ( i = 1; i <= n; i++ )
for ( j = 1; j < i; j++ )
dp[2][i] = min ( dp[2][i], 1 + max(dp[1][j-1], dp[2][i-j]) );
}
int main()
{
count(200);
int n;
while ( scanf("%d",&n) != EOF )
{
for ( int i = 1; i <= n; i++ )
printf("%d %d\n",i,dp[2][i]);
}
return 0;
}
两个鸡蛋100层楼(DP)
最新推荐文章于 2024-05-07 14:05:41 发布