poj 2228 Naptime(DP的后效性处理)
\(Naptime\)
描述
Goneril是一只睡眠不足的母牛。她的一天被划分为N(3 <= N <= 3,830)相等的时间段,但她只能在床上花费B(2 <= B <N)不一定是连续的时期。由于她的牛激素水平,每个时期都有自己的效用U_i(0 <= U_i <= 200,000),这是在此期间从睡眠中获得的休息量。这些效用值是固定的,与Goneril选择做的无关,包括她决定在床上时。
在她的闹钟的帮助下,她可以准确选择在床上度过的时间段和花费更多关键项目的时间,例如写论文或看棒球。但是,她只能在一段时间内进入或下床。
她想选择她的睡眠时间,以最大限度地提高她在睡觉期间的效用总和。不幸的是,每次她爬到床上,她都必须在第一段时间内入睡,并且从那个时期起就没有睡眠效用。
周期环绕一圈; 如果Goneril在床上花费N和1期,那么她确实会在1期内获得
睡眠效用.Goneril可以达到的最大睡眠效用是多少?
输入
*第1行:两个以空格分隔的整数:N和B
*第2..N + 1行:第i + 1行包含一个0到200,000之间的整数U_i
输出
这一天分为5个时段,按顺序为实用工具2,0,3,1,4。Goneril必须选择3个时期。
样本输入
5 3
2
0
3
1
4
样本输出
6
\(solution:\)
这道题用了取消环形后效性的第二种方法:强制两次线性DP。为什么可以用两次DP来取消环形后效性呢?我们发现这道题原本就是一道线性DP,只是现在它变成了一个环。于是我们考虑如果我们从某个节点拆开这个环会有什么情况我们算不到(现在我们以断开一号节点与最后一个节点举例),于是在这个环上得出的答案,一定可以分为两种情况,一种是它睡的这几个小时里不会连续包括最后一个小时和第一个小时,第二种就是这几个小时是有两天共同平凑出来的(就是最后一个小时和第一个小时都在睡觉)。于是我们自然想到能不能分开求两种情况,第一种直接线性DP就行了,而第二种我们琢磨一下就能发现这种情况一定要选第一个小时睡觉!然后就行了。
\(code:\)
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register intusing namespace std;int n,m,ans;
int a[4005];
int f[4005][2];inline int qr(){register char ch; register bool sign=0; rg res=0;while(!isdigit(ch=getchar())) if(ch=='-')sign=1;while(isdigit(ch)) res=res*10+(ch^48),ch=getchar();return sign?-res:res;
}int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);n=qr(); m=qr();for(rg i=1;i<=n;++i) a[i]=qr();for(rg i=0;i<=n;++i)f[i][0]=f[i][1]=-1e9;f[0][0]=0;for(rg i=1;i<=n;++i){rg x=min(i,m);for(rg j=x;j>=0;--j){f[j][0]=max(f[j][0],f[j][1]);if(j)f[j][1]=max(f[j-1][0],f[j-1][1]+a[i]);}}ans=max(f[m][0],f[m][1]);for(rg i=1;i<=n;++i)f[i][0]=f[i][1]=-1e9;f[1][1]=a[1];for(rg i=2;i<=n;++i){rg x=min(i,m);for(rg j=x;j>=0;--j){f[j][0]=max(f[j][0],f[j][1]);if(j)f[j][1]=max(f[j-1][0],f[j-1][1]+a[i]);}}ans=max(ans,f[m][1]);printf("%d\n",ans);return 0;
}
转载于:https://www.cnblogs.com/812-xiao-wen/p/11001704.html
poj 2228 Naptime(DP的后效性处理)相关推荐
- 【环形dp】poj 2228 Naptime
题目链接 题意:一天分为N个时间片(可顺到下一天->环形),选择其中B个睡觉.选择第i个时间片能获得u_i点值,但是选择的一个区间内的第一个时间片用来入睡(没睡着),无法获得u_i值.问最大能获 ...
- POJ 2228. Naptime
链接 http://poj.org/problem?id=2228 题意 在一天 nnn 个小时中取 bbb 个小时,使权值和最大,bbb 个小时可分成若干段,每段的第一个小时的权值不计入总和,第 n ...
- poj 2228 Naptime
题目 从N个元素(环形队列)中选出B个,求最大得分.(元素得分仅当其前面的元素也被选择了) 分析 我就不想口胡了 链接 现在知道了处理环上的dp还能这样玩 code #include<iostr ...
- poj 2228 环形DP
题意: 一天有n个时间,有一只牛希望一天可以休息睡小时.如果牛在第i时刻已经熟睡,他可以得到ui的休息.但是如果他在i时刚刚入睡,他不能得到休息.牛可以从前一天晚上睡到第二天.睡觉时间也不一定连续.问 ...
- Cogs 376. [IOI2002]任务安排(后效性DP)
[IOI2002]任务安排 ★☆ 输入文件:batch.in 输出文件:batch.out 简单对比 时间限制:1 s 内存限制:128 MB N个任务排成一个序列在一台机器上等待完成(顺序不得改变) ...
- 【动态规划】有后效性 DP
P3232 [HNOI2013]游走 Description\text{Description}Description 给定一个 nnn 个点 mmm 条边的无向连通图.从 111 号节点出发,每一步 ...
- 0x55. 动态规划 - 环形与后效性处理(例题详解 × 6)
目录 0x55.1 环形结构上的动态规划问题 两次DP法 Problem A. Naptime 破环成链法 Problem B. 环路运输 Problem C. Two Rabbits 0x55.2 ...
- bzoj3875: [Ahoi2014Jsoi2014]骑士游戏 spfa处理有后效性动规
bzoj3875: [Ahoi2014&Jsoi2014]骑士游戏 Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的 ...
- 【BZOJ3875】【Ahoi2014】骑士游戏 SPFA处理有后效性动规
Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,JY ...
最新文章
- 【 MATLAB 】Fourier Transforms ( fft )
- 皮一皮:说好的一起守护光和未来呢...
- os和sys模块的常用方法
- sql server 补齐0学习总结
- 9WinMap 映射
- 计算机网络参考模型与5G协议
- 23王道——中序线索树
- html中li的圆点,CSS中li圆点样式
- ABAP clear、refresh、free的区别
- 戴尔台式机修复计算机,dell电脑win10自动修复你的电脑未正确启动怎么修复
- 关闭计算机用英语怎么说,关闭计算机用英语肿么说
- Excel以逗号拆分数据
- 【大数据分析软件应用在足球预测实例】足球滚球走地大小球分析方法和技巧
- 鼠标cursor属性和如何使用cursor的url属性
- 【JAVA今法修真】 第五章 练气百日,筑基三年
- 学习【瑞吉外卖⑪】SpringBoot单体项目_项目优化
- Python math.cosh() 方法
- 使用logisim搭建单周期CPU与添加指令
- 开放式问题:打造无可限量的系统
- android shape 画虚线
热门文章
- gbase xdm管理控制台说明
- 解决Invalid HTTP_HOST header: 'xxx.xx.xxx.xxx:8000'. You may need to add 'xxx.xx' to ALLOWED_HOSTS!
- 名不虚传。涵盖全微服务操作的Spring Cloud Alibaba PDF竟出自阿里
- uni-app制作海报并转发
- 对 emwin 窗口创建的认识
- Tello无人机马达更换
- poi读取Excel时日期为数字 的解决方法
- 特斯拉充电电流设置多大_特斯拉电动汽车充电规格?
- moo0_使用Moo0文件粉碎器轻松粉碎文件
- Python中当pip安装不成功的解决办法