Dropping water balloons UVA - 10934(递推)
Posted yijiull
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dropping water balloons UVA - 10934(递推)相关的知识,希望对你有一定的参考价值。
Dropping water balloons
题意:
可以说是很懵比了。。。
和上一个题有相似之处,就是我们需要判断的结果是一个未知量。如本题气球的硬度,可能为1,2,3,------,n,n+1。
最坏情况需要测到n楼才知道结果。题目要求确定气球硬度,我们要考虑所有情况。【即我们要求的是最少测几次才可以测到n楼。】
用d[i][j]表示i个气球j次试验最多测到d[i][j]楼(即运气足够好的情况下可以测到几层楼)【这也是题目要求的,最少几次!!】
(上面这两条红字放一起有点难以理解)
我们首先要求的是第一次最好在哪一层楼进行测试
先设第一次为k楼最好(以下八行都是在这个假设下进行的,记为假设一吧)
如果第一次气球就破,则说明i-1个气球j-1次试验测(即d[i-1][j-1])需要测到k-1层楼才可以,即d[i-1][j-1]==k-1。证明如下:
反证法:
假设d[i-1][j-1]=x<k-1,则x楼到k楼之间是断层,说明第一次测试的k楼没有意义,k不是最好,与假设一矛盾,故d[i-1][j-1]>=k-1
假设d[i-1][j-1]=x>k-1,即d[i-1][j-1]>=k,说明i-1个气球j-1次就可以测到k+层楼了,第一次测试的k层楼没有意义,k不是最好,与假设一矛盾,故d[i-1][j-1]<=k-1
综上,d[i-1][j-1]==k-1。
即i个气球j次试验第一次最好在k=d[i-1][j-1]+1楼进行测试
同时这也是第一次气球就破的情况下最多可以测到的楼层数d[i][j]=k=d[i-1][j-1]+1。
如果第一次气球不破,那么我们还剩下i个气球j-1次试验,最多可以再测d[i][j-1]层楼(要仔细考虑,和高度无关),再加上之前的k楼
即第一次气球不破的情况下最多可以测到的楼层数d[i][j]=d[i][j-1]+k=d[i][j-1]+d[i-1][j-1]+1。
所以,综上分析,i个气球j次试验最多可以测到d[i][j]=d[i][j-1]+k=d[i][j-1]+d[i-1][j-1]+1。
现在回到题目,【即我们要求的是最少测几次才可以测到n楼。】
根据递推公式预处理d[i][j]表。
气球数目为k,楼层为n,只需枚举次数j,当d[k][j]>=n时j即为所求解。
1 #include <cstdio> 2 #include <bits/stdc++.h> 3 using namespace std; 4 #define LL long long 5 LL f[110][65]; 6 int k; 7 LL n; 8 9 int main() 10 { 11 memset(f,0,sizeof(f)); 12 for(int i=1;i<=100;i++) 13 for(int j=1;j<64;j++) 14 f[i][j]=f[i-1][j-1]+1+f[i][j-1]; 15 while(scanf("%d%lld",&k,&n)&&k) 16 { 17 if(f[k][63]<n) 18 { 19 puts("More than 63 trials needed."); 20 continue; 21 } 22 for(int i=1;i<=63;i++) if(f[k][i]>=n) 23 { 24 printf("%d\\n",i); 25 break; 26 } 27 } 28 return 0; 29 }
以上是关于Dropping water balloons UVA - 10934(递推)的主要内容,如果未能解决你的问题,请参考以下文章
UVA10934 Dropping water balloons
Dropping water balloons (入门dp)
Dropping water balloons UVA - 10934(递推)
uva 10934 Dropping water balloons
UVA10934 Dropping water balloonsDP
Prometheus federation ignoring/dropping # HELPline from metrics