两个鸡蛋100层楼(DP)

来源:互联网 发布:php博客系统 编辑:程序博客网 时间:2024/05/01 10:04
#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;}

原创粉丝点击