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 ...
随机推荐
- ASP.NET - (Session)后台登陆时,判断是不是已经登陆,如果不是,跳转回登陆页
admin(小写):用户输入的账户. password(小写):用户输入的密码. 1.先将用户名和密码,存储到Session会话中. Session["Admin"] = admi ...
- Qt之开机自启动及拥有管理员权限
源地址:http://blog.sina.cn/dpool/blog/s/blog_a6fb6cc90101feia.html Windows开机自启动的程序很多,包括系统软件.杀毒软件.一些其他安装 ...
- 对 sql server 数据库的备份进行加密
原文:对 sql server 数据库的备份进行加密 嗯,最近在研究数据库备份相关的东西,考虑到应该为数据库备份加个密,就准备从网上搜索一下看看有什么好办法,没想到还挺乱... 首先,我从网上搜到的, ...
- Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法
Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法 在Action中方法的返回值都是字符串行,一般情况是返回某个JSP,如: return "xx" ...
- 14.10.3 InnoDB Checkpoints InnoDB 检查点:
14.10.3 InnoDB Checkpoints InnoDB 检查点: 你的log files 变的很大可能会降低磁盘性能在checkpointing的时候, 它通常设置设置log files总 ...
- mongdb修改密码
正确做法,利用db.changeUserPassword > db.changeUserPassword('tank2','test');
- ELK日志系统:Elasticsearch + Logstash + Kibana 搭建教程(转)
环境:OS X 10.10.5 + JDK 1.8 步骤: 一.下载ELK的三大组件 Elasticsearch下载地址: https://www.elastic.co/downloads/elast ...
- STL内存管理器的分配策略
STL提供了很多泛型容器,如vector,list和map.程序员在使用这些容器时只需关心何时往容器内塞对象,而不用关心如何管理内存,需要用多少内存,这些STL容器极大地方便了C++程序的编写.例如可 ...
- c#Enum的用法
public enum ResType { Role = 0, Dept = 1, Group = 2, Site = 3, Org = 4, Sub=8 } 这里定义了一个enum ResTy ...
- Eclipse 修改maven 仓储Repository位置
简述: 使用两个Nexus, 需要配置两份不同的Maven仓库 步骤: 1. 下载新的Maven运行包 2. 进入conf/ 修改setting.xml项 <localRepository> ...