抛鸡蛋(玻璃球或围棋)-优化版
来源:互联网 发布:重庆seo外包公司费用 编辑:程序博客网 时间:2024/06/12 01:18
题目:一个100层的大厦,你手中有两个相同的鸡蛋(玻璃球或围棋)。从这个大厦的某一层扔下鸡蛋((玻璃球或围棋))就会碎,用你手中的这两个鸡蛋(玻璃球或围棋),找出一个最优的策略,来得知那个临界层面。
分析:这道题比较直观的想法是通过二分来寻找,但是二分的解法应该不是最优的。这里讨论通过动态规划的思路来求解。这里的最优策略指的是在这种策略下无论哪个临界层面在第几层,测试的次数都最少。设F(n,k)为用k个玻璃球来测试n层大厦的临界层的最少次数,状态转移方程如下:
F(n,k)=min{max{F(r-1,k-1), F(n-r,k)}+1, 1<=r<=n},边界条件:F(n,1)=n, F(1,k)=1 F(0,k)=0(原文中F(n,1)=n-1, F(1,k)=0 F(0,k)=0,考虑到最顶层也可能不碎,所以更改边界条件)
状态转移方程可以这样来考虑,假设在n层楼中的第r层抛一次(对应方程中的"+1"),会有两种情况发生:
- (1)玻璃球碎,说明在第1到第r-1层楼中测试可以得到临界层,问题转化为一个子问题:求F(r-1,k-1)
- (2)玻璃球不碎,说明临界层在第r+1层到第n层这n-r层楼中,问题转化为子问题:求F(n-r,k)
过程如下图所示
因为考虑的是最坏情况下抛球策略的所需测试次数的最小值,所以取这两种情况中的较大值,并遍历每一个可能的r,取其最小值即得到F(n,k)。实现代码如下:
- #include<stdio.h>
- #include <limits>
- #include<algorithm>
- #define MAX_FLOOR 512
- #define MAX_BALL 100
- using namespace std;
- int dp(int n, int k)
{
if(k<1 || n<1) return -1;
if(k==1) return n-1;
if(n==1) return 0;
int M[MAX_BALL][MAX_FLOOR];
int i,j,r;
int temp, min;
for(i=0;i<=k;i++){
M[i][0]=0;
printf("(%d,0)=%d\n",i,M[i][0]);
M[i][1]=1; //F(1,k)=F(0,k)=0
printf("(%d,1)=%d\n",i,M[i][1]);
}
for(j=2;j<=n;j++){
M[1][j]=j; //F(n,1)=n-1
printf("(1,%d)=%d\n",j,M[1][j]);
}
/*
* 状态转移方程:
* F(n,k)=min{max{F(r,k-1)+1, F(n-r,k)+1}, 1<=r<=n}
* */
for(i=2;i<=k;i++)
for(j=2;j<=n;j++)
{
min = numeric_limits<int>::max();
int tmpr = 1;
for(r=1;r<=j;r++)
{
temp = max(M[i-1][r-1], M[i][j-r])+1;
if(j==6){
printf(" M[%d][%d]=%d,M[%d][%d]=%d\n",i-1,r-1,M[i-1][r-1],i,j-r,M[i][j-r]);
}
if(temp<min){
tmpr = r;
min = temp;
}
}
M[i][j] = min;
}
}
return M[k][n];//F(n,k)
}
int main(){
printf("%d",dp(6,2));
} 抛鸡蛋(玻璃球或围棋)
- 抛鸡蛋(玻璃球或围棋)-优化版
- 抛鸡蛋(玻璃球或围棋)
- 动态规划解抛鸡蛋(玻璃球)问题
- 三个鸡蛋(玻璃球、围棋子)确定楼层问题公式推导
- 抛棋子抛鸡蛋抛围棋典型题解
- 抛玻璃球
- 腾讯抛玻璃球问题
- 玻璃球
- 网页标签的优化【鸡蛋】
- 网络围棋单机版
- 网络围棋单机版
- 围棋
- 围棋
- 围棋
- 围棋
- 围棋
- 围棋
- 围棋
- 转 WinCE中命令行工具Viewbin简介
- WinCE下,快速编译驱动及BSP
- RTL8139网卡在wince6.0下不显示
- 制作从U盘安装的windows embedded …
- myeclipse8.5注册码
- 抛鸡蛋(玻璃球或围棋)-优化版
- VS2010遇到_WIN32_WINNT宏定义问题
- vc 显示文字 图片
- cmd 备忘
- vc++ win32程序中使用MFC
- gSoap开发webservice client
- libcurl教程
- LibCurl编程流程
- VC控制台程序在后台运行