POJ 2228 Naptime
来源:互联网 发布:阿里云服务器网站备案 编辑:程序博客网 时间:2024/06/05 21:17
POJ 2228 原题
题目描述
在某个星球上,一天由
为了身体健康,这头牛希望遵循生物钟,每天采用相同的睡觉计划。另外,由于时间是连续的,即每一天的第
请你帮忙给这头牛安排一个睡觉计划,使它每天恢复的体力最多。
输入
- 第一行为两个数,
N 和B 。 - 下面为
N+1 行,每行包含一个数字:Ui 。
输出
- 可恢复的最大能量值。
样例输入
5 3
2
0
3
1
4
样例输出
6
提示
牛在第
在第
Sol
Easy Ver.
先来考虑一下简化的问题:第f[i][j][1]
表示前f[i][j][1]
表示前
注意:i包括现在。
可知:
1.
2.
3.
4.
这时的答案应该是:
除了
Original Mode
这个简化的问题与原问题的差别:
可能漏掉了第
可以考虑一下2种情况:
1. 1时休息,N时不休。
2. 1时休息,N时也休。
综上所述(边界条件)
- (1)第一段不睡,这样最后一段睡不睡都无所谓:
边界为:f[1][0][0] = 0, f[1][1][1] = -INF
(f[1,0,0]为在1时不休息;f[1,1,1]在这里不合理 )
结果为:max(f[N][B][0], f[N][B][1])
- (2)第一段睡,最后一段也睡:
边界为:f[1][1][1] = utility[1], f[1][0][0] = -INF
(f[1,1,1]为在1时已经休息且不是第一小时;f[1,0,0]为在第1小时没休息,不合理 )
结果为:f[N][B][1]
- (3)第一段睡,最后一段不睡:
边界为:f[1][1][1] = 0, f[1][0][0] = -INF
(f[1,1,1]为在1时已经休息且是第一小时;f[1,0,0]为在第1小时没休息,不合理 )
结果为:f[N][B][0]
初始化的问题
- 不能全部把
F[][][]
都设定为-INF
:因为f[i][0][0]
都被置为-INF
,即意味着“前i小时都不睡是不可能发生的”,然而是可以最后几个小时休息的。 - 不能全部把
F[][][]
都设定为0
:因为像f[i][0][1]
这样的状态(共睡了0小时,现在正在休息)是不可能发生的,所以必须置为-INF
。 - 解决方法:先全部置为
-INF
,设定边界条件,然后在每次循环前把f[i][0][0]
置为0。
要注意的问题
由于N的范围是
鉴于第
代码
#include <cstdio>#include <cstring>#include <cctype>#include <algorithm>#define __INITIALIZE memset(f, 0xc0c0c0c0, sizeof f)#define rep(i, j, k) for (int i = j; i <= k; i++)using namespace std;inline int read() { int r = 0; char cc = getchar(); while (!isdigit(cc)) cc = getchar(); while (isdigit(cc)) { r = r * 10 + cc - 48; cc = getchar(); } return r;}int n, b;int f[2][3831][2];int r[3831];int temp[3];void solve() { rep (i, 2, n) { f[i % 2][0][0] = 0; rep (j, 1, b) { f[i % 2][j][0] = max(f[(i - 1) % 2][j][0], f[(i - 1) % 2][j][1]); f[i % 2][j][1] = max(f[(i - 1) % 2][j - 1][1] + r[i], f[(i - 1) % 2][j - 1][0]); } }}int main(int argc, char **argv) { n = read(); b = read(); for (int i = 1; i <= n; i++) { r[i] = read(); } //1 awake __INITIALIZE; f[1][0][0] = 0; f[1][1][1] = 0xc0c0c0c0; solve(); temp[0] = max(f[n % 2][b][1], f[n % 2][b][0]); //1 sleep, n awake __INITIALIZE; f[1][0][0] = 0; f[1][1][1] = 0; solve(); temp[1] = f[n % 2][b][0]; //1 sleep, n sleep __INITIALIZE; f[1][1][1] = r[1]; f[1][0][0] = 0xc0c0c0c0; solve(); temp[2] = f[n % 2][b][1]; printf("%d", max(max(temp[0], temp[1]), temp[2]));}
- POJ 2228 Naptime
- poj 2228 Naptime
- poj 2228 Naptime dp
- POJ 2228 Naptime
- POJ 2228 Naptime 环状DP
- POJ 2228 Naptime (DP) #by Plato
- 【poj 2228】 poj 2228 Naptime dp 环形dp的特殊处理
- poj2228 Naptime
- TOJ 1631 Naptime -- 环形DP
- bzoj 1737: [Usaco2005 jan]Naptime 午睡时间 (DP)
- [BZOJ1737][Usaco2005 jan]Naptime 午睡时间(dp)
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- hdu 4920 Ugly Problem [模拟+大数减法]
- 课堂练习3
- 动态内存管理(malloc、 free、 calloc、 realloc)
- 第六单元笔记整理
- 游戏准备工作 -- 计算, 思路解析
- POJ 2228 Naptime
- C/C++中的Split函数(字符串自动分割)
- CXF与SPRING的无缝整合时,为什么不用写CXF的配置文件cxf-servlet.xml?
- 对话框-DialogFragment+AlertDialog+Calendar+DatePicker
- 个人计划《2017-10-11》
- spring 事务的传播
- python学习之Turtle 5
- React根据宽度自适应高度
- Python网页请求库Requests