\(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的后效性处理)相关推荐

  1. 【环形dp】poj 2228 Naptime

    题目链接 题意:一天分为N个时间片(可顺到下一天->环形),选择其中B个睡觉.选择第i个时间片能获得u_i点值,但是选择的一个区间内的第一个时间片用来入睡(没睡着),无法获得u_i值.问最大能获 ...

  2. POJ 2228. Naptime

    链接 http://poj.org/problem?id=2228 题意 在一天 nnn 个小时中取 bbb 个小时,使权值和最大,bbb 个小时可分成若干段,每段的第一个小时的权值不计入总和,第 n ...

  3. poj 2228 Naptime

    题目 从N个元素(环形队列)中选出B个,求最大得分.(元素得分仅当其前面的元素也被选择了) 分析 我就不想口胡了 链接 现在知道了处理环上的dp还能这样玩 code #include<iostr ...

  4. poj 2228 环形DP

    题意: 一天有n个时间,有一只牛希望一天可以休息睡小时.如果牛在第i时刻已经熟睡,他可以得到ui的休息.但是如果他在i时刚刚入睡,他不能得到休息.牛可以从前一天晚上睡到第二天.睡觉时间也不一定连续.问 ...

  5. Cogs 376. [IOI2002]任务安排(后效性DP)

    [IOI2002]任务安排 ★☆ 输入文件:batch.in 输出文件:batch.out 简单对比 时间限制:1 s 内存限制:128 MB N个任务排成一个序列在一台机器上等待完成(顺序不得改变) ...

  6. 【动态规划】有后效性 DP

    P3232 [HNOI2013]游走 Description\text{Description}Description 给定一个 nnn 个点 mmm 条边的无向连通图.从 111 号节点出发,每一步 ...

  7. 0x55. 动态规划 - 环形与后效性处理(例题详解 × 6)

    目录 0x55.1 环形结构上的动态规划问题 两次DP法 Problem A. Naptime 破环成链法 Problem B. 环路运输 Problem C. Two Rabbits 0x55.2 ...

  8. bzoj3875: [Ahoi2014Jsoi2014]骑士游戏 spfa处理有后效性动规

    bzoj3875: [Ahoi2014&Jsoi2014]骑士游戏 Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的 ...

  9. 【BZOJ3875】【Ahoi2014】骑士游戏 SPFA处理有后效性动规

    Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,JY ...

最新文章

  1. java list 两个集合比较 不存在则新增 存在修改_Java之集合
  2. Linux学习笔记—— 权限及权限管理
  3. 算法-----有序数组的平方
  4. pytorch 检索数组
  5. Cissp-【第2章 资产安全】-2021-1-14(163页-185页)
  6. Qt Creator导入3D资产Importing 3D Assets
  7. (Tool)Symantec Northon和eset northon哪个好?
  8. Cookie,Session基础知识
  9. CSS深入理解学习笔记之vertical-align
  10. view 冒号作用 组件中属性_如何解析名称中带有冒号的JSON?安卓/ Java...
  11. “dedeCMS 提示信息!”跳转页,如何修改文字?
  12. 七彩影视双端新版本源码
  13. vc mysql free result_VC的MySQL编程
  14. 相分离相关文章阅读Intrinsically disordered linkers determine the interplay between phase separation and gelat
  15. 感应加热ZVS制作图解
  16. Win11安装OBS Studio的详细步骤图文教程
  17. sdn 深信服_推动物联网安全行业发展,青莲云受邀出席2019深信服创新大会
  18. vite和webpack的区别
  19. STM32实现74HC595控制
  20. 电脑硬件升级——笔记本更换更大容量的固态硬盘,并进行系统迁移

热门文章

  1. 正点原子gt9xx系列linux驱动移植
  2. PyQt5 QTableWidget 删除所有行
  3. 数据探索简介——质量分析、特征分析
  4. QT5打开图片并显示
  5. 用CSS实现一个聚光灯效果
  6. 一群对J2EE充满激情的兄弟
  7. 商业需求文档(BRD)怎么写
  8. Taurus.MVC 如何升级并运行在NET6、NET7
  9. pos机骗局收取押金如何投诉-真实案列解答
  10. C++大数乘加减除比较操作集(含测试原码)