题意:

猜数字, 给定 G, L, G 表示可以猜的次数, 每猜一次, G减一, 假如猜的 number 大于 target, L 还需减一, 当 L == -1 或者 G==0 时, 若还没猜中, 则失败

思路:

1. 举例子

  <1> 当 G = 3, L = 0 时, 只能从 1 向上猜, 最大的数字是 3

  <2> 当 G = 2, L = 1 时, 不必从 1 猜起, 假设猜 k, 假如小了, 状态变成 <G,L>(1,0), 由 (1) 得到的规律知, k 不能大于 2; 假如大了, 那么状态变成 <G,L>(1,1), 还有一次机会, 可见, <G,L>(2,1) 等于 3

  <3> 当 <G,L>(3,1) 时, 仍然假设猜 K, 假如小了, 状态变成 <G,L>(2,0), 假如大了, 变成<G,L>(2,1), 又 <G,L>(2,1)可以保证3个数能被猜出, 所以 <3,1> 等于 6

2. 从 1 的例子足以看出规律, 一个状态<G,L> 能够保证多少个数能被猜出, 比如 <G,L>(3,1)=6,  <G,L>(3,0)=3, <G,L>(2,1)=3

3. 状态转移方程, dp[i][j] 表示G=i, L = j 在最差的情况下能够保证被猜出数的个数

  dp[i][j] = dp[i-1][j-1] (low 了) + 1 + dp[i-1][j](high)了

4. 如果 j >= i, 那么 dp[i][j] = dp[i][i-1]

总结:

1. 第 11 行代码, j 应该从 1 开始, WA 过一次

代码:

#include <iostream>
using namespace std; int G, L;
int dp[100][100];
int solve_dp() {
for(int i = 0; i <= G; i++)
dp[i][0] = i; for(int i = 1; i <= G; i ++) {
for(int j = 1; j <= L; j++) {
if(j >= i)
dp[i][j] = dp[i][i-1];
else
dp[i][j] = dp[i-1][j-1]+1+dp[i-1][j];
}
}
return dp[G][L];
} int main() {
freopen("E:\\Copy\\ACM\\测试用例\\in.txt", "r", stdin);
int testcase = 0;
while(scanf("%d%d", &G, &L) && G != 0) {
testcase++;
printf("Case %d: %d\n", testcase, solve_dp());
}
return 0;
}

  

POJ 1243 One Person的更多相关文章

  1. POJ 1243

    #include <iostream> #include <algorithm> #include <cmath> #define MAXN 50 using na ...

  2. POJ题目细究

    acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  102 ...

  3. 【转】POJ百道水题列表

    以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...

  4. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  5. POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7192   Accepted: 3138   ...

  6. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  7. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  8. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  9. POJ 2739. Sum of Consecutive Prime Numbers

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20050 ...

随机推荐

  1. Python import random报错处理办法

    [转自]http://blog.chinaunix.net/uid-26000296-id-4356738.html python安装失败:make的时候报错: /usr/include/tkDecl ...

  2. JS面向对象教程

    初探 我们知道Javascript中的变量定义基本如下: var name = 'Chen Hao';; var email = 'haoel(@)hotmail.com'; var website ...

  3. jquery ajax异步提交表单数据的方法

    使用jquery的ajax方法可以异步提交表单,成功后后台返回json数据,回调函数处理,可以不用刷新页面,达到异步的目的: 处理表单的数据可以用serialize()方法进行序列化,而如果提交的数据 ...

  4. Makefile学习之路——3

    特殊变量: 在Makefile中,有两个变量特殊变量会经常用到:MAKE和MAKECMDGOALS.MAKE变量表示的是当前处理Makefile的命令名是什么.当需要在Makefile中运行另一个Ma ...

  5. jfinal视频目录

    目录-----------------------------------------------------------第一章 简介第二章 JFine2.0 maven demo第三章番外篇 JFi ...

  6. JDBC的介绍

    JDBC详解   1.JDBC是什么? JDBC(JAVA DataBase Connection)即JAVA数据库连接技术,JDBC API是一个Java API,可以访问任何类型表列数据,特别是存 ...

  7. dubbox2.8.4例子教程二

    简介 上篇博客写了个dubbox生产者,也用HttpClient代码测试了rest服务,下面记录dubbox消费者工程  一.工程结构    一.Simple.java package bhz.ent ...

  8. 【Visual Studio】控制台程序运行时一闪而过

    问题:写一个C#控制台程序,运行时控制台一闪而过.程序结束.无法看清控制台输出的结果. 办法: 方法一二三都有人写过百度经验了:怎么解决VS运行程序一闪而过 其实还有一种办法,就是把控制台程序改为Wi ...

  9. Extjs Ext.ux.IFrame的用法 以及父子窗口间函数相互调用

    Extjs Ext.ux.IFrame的用法 以及父子窗口间函数相互调用 Ext.ux.IFrame Extjs官方提供的一个组件,可以很方便的使用. 这样就完成了一个简单的IFrame的使用,通过E ...

  10. Hive中order by,sort by,distribute by,cluster by的区别

    一:order by order by会对输入做全局排序,因此只有一个Reducer(多个Reducer无法保证全局有序),然而只有一个Reducer,会导致当输入规模较大时,消耗较长的计算时间.关于 ...