poj1243(经典dp)
题目链接:http://poj.org/problem?id=1243
题意:让你猜一个物品的价格,猜低了或者猜高了都会提示你。G,L,表示你有G次机会猜一个数,如果猜错了,G会减少1次,如果你的错误是应该是猜高了,那么L也会少一次(猜低了L不会少)。如果G次机会都用完了,则输;若G次机会还有剩余,而L次机会用完了,这时再猜一个数,若猜高了,那么也输了。让你确定一个数字N,以保证在G,L的条件下,你一定能猜到[1,N]以内的任何一个数
1.如果L等于0,也就是说你在猜的过程中,绝对不能猜高,所以你只能从1开始猜,并依次为2,3,4……最大能猜到的数是G,所以N=G,这样才能保证你一定能猜到其中的任何一个数
2.L>G,这是个迷惑的情况,其实L比G大是没意义的,因为无论猜高了猜低了G都会减少,所以G一定先为0,G L等价于G G
3.L=G,这个情况和上面的情况是一样的,这样的猜测是不需要考虑什么猜高猜低的,因为G也一定是先变为0,那么像G G这种情况能猜的范围是多少呢?就是N=(2^G)-1,这是由二分查找的性质可以得知的
4.L<G,这个才是真正需要DP的。这样考虑策略,dp[i][j]表示还有i次机会,j次猜高的机会情况下能猜测的最大长度(即N)
我们猜测一个数字x
如果猜低,剩下i-1次机会,j次猜高的机会,那么正确的数字在[x+1, INF)范围内,假设我们已经知道了dp[i-1][j],那么这个数字只能出现在[x+1 , dp[i-1][j]+x]范围内,才能保证我们一定猜到它
如果猜高,剩下i-1次机会,j-1次猜高的机会,那么正确的数字在[1,x-1]范围内,假设我们已经知道了dp[i-1][j-1],那么为了最大化,必定要使x=dp[i-1][j-1]+1(若不选x刚好大于dp[i-1][j-1],太小会使范围重复,太大则不能在规则内猜得到)
如果猜对了,那么就赢了,即总范围+1
所以在(i,j)的情况下我们能猜的最大范围就是 dp[i][j]=dp[i-1][j-1]+1+dp[i-1][j];
例如:3 1先选择点3,假设目标低于3,还有两次机会必定能猜到。假设目标高于3,再选择5,假设目标低于5,还有一次机会刚好猜4,若高于5,刚好猜6.所以总范围为6.即dp[3][1]=dp[2][0]+1(点3本身)+dp[2][1].
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define N 50010
using namespace std;
int dp[][];
void init()
{
for(int i=;i<=;i++)
{
dp[i][]=i;dp[i][i]=(<<i)-;
for(int j=;j<i;j++)
{
dp[i][j]=dp[i-][j]+dp[i-][j-]+;
}
}
}
int main()
{
int n,m,cas=;
init();
while(scanf("%d%d",&n,&m)>)
{
if(n+m==)break;
if(n<m)m=n;
printf("Case %d: %d\n",cas++,dp[n][m]);
}
}
poj1243(经典dp)的更多相关文章
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- poj1458 求最长公共子序列 经典DP
Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45763 Accepted: 18 ...
- NYOJ - 矩形嵌套(经典dp)
矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...
- 51nod 1412 AVL树的种类(经典dp)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1412 题意: 思路: 经典dp!!!可惜我想不到!! $dp[i][k] ...
- NYOJ 16 矩形嵌套(经典DP)
http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度: ...
- poj 1050 To the Max 最大子矩阵和 经典dp
To the Max Description Given a two-dimensional array of positive and negative integers, a sub-rect ...
- CS Academy Distinct Neighbours(经典dp)
CS Academy Distinct Neighbours(经典dp) 题意: 求相邻无相同数字的合法的排列数 题解: 题解 先将相同的数字分为一类,假设共有n组 定义\(dp[i][j]\)表示前 ...
- 【经典dp 技巧】8.13序列
经典的拆绝对值 题目大意 给定$n$个具有顺序的序列,允许对每个序列循环移动.记第$i$个序列尾元素为$x$,$i+1$个序列首元素为$y$,定义其连接收益为$|x-y|*i$,求$n$个序列连接最大 ...
- POJ 1160:Post Office 邮局经典DP
Post Office Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17168 Accepted: 9270 Desc ...
随机推荐
- fzu 1911 Construct a Matrix(矩阵快速幂+规律)
题目链接:fzu 1911 Construct a Matrix 题目大意:给出n和m,f[i]为斐波那契数列,s[i]为斐波那契数列前i项的和.r = s[n] % m.构造一个r * r的矩阵,只 ...
- QTableWidget表格合并若干问题及解决方法
Qt提供 QTableWidget作为表格的类以实现表格的基本功能,表格中所装载的每一个单元格由类QTableWidgetItem提供.这是基于表格实现 Qt提供的一个基础类,若想实现定制表格和单元格 ...
- MFC自绘控件学习总结第二贴
首先感谢大家对第一帖的支持,应一些网友烈要求下面我在关于上一贴的一些补充和说明(老鸟可以无视)这一贴是实战+理论不知道第一帖的先看第一帖:http://topic.csdn.net/u/2011071 ...
- 部署Spring Boot应用
在开发Spring Boot应用的过程中,Spring Boot直接执行public static void main()函数并启动一个内嵌的应用服务器(取决于类路径上的以来是Tomcat还是jett ...
- mysql基础: mysql列类型--字符串
mysql列类型:整型 http://blog.csdn.net/jk110333/article/details/9342283 mysql列类型--时间和日期 http://blog.csd ...
- POJ 3321 Apple Tree DFS序+fenwick
题目大意:有一颗长满苹果的苹果树,有两个操作. 1.询问以一个点为根的子树中有多少个苹果. 2.看看一个点有没有苹果,假设没有苹果.那么那里就立即长出一个苹果(= =!):否则就把那个苹果摘下来. 思 ...
- .net三步配置错误页面,让你的站点远离不和谐的页面
假设你的站点出现一堆让人看不懂的报错,那么你就不是一个合格的程序猿.也不是一个合格的站长. 以下的方面能够帮助你的站点远离让人头大的页面. 第一步:配置web.config 打开web.config, ...
- 编程语言性能游戏排行榜,C/C++第一ATS第二JAVA第三
编程语言性能游戏排行榜,C/C++第一ATS第二JAVA第三 编程语言性能游戏排行榜,C/C++第一ATS第二JAVA第三
- Linux入门基础#2:Linux文件系统基本结构
本文出自 http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...
- 《转载》常用算法经典代码(C++版)
转自:http://blog.renren.com/blog/311453043/736944237 一.快速排序 void qsort(int x,int y) //待排序的数据存放在a[1]..a ...