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 int
using 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;
}
poj 2228 Naptime(DP的后效性处理)的更多相关文章
- poj 2228 Naptime dp
这个题目的状态还是比较好想的,dp[i][j]表示已经睡了i个时段,最后睡在j时段的最优值,但是需要处理环的情况,我的做法是算两次,第一次不处理环,第二次强制性要求第一个时段需要睡,然后查看dp[m] ...
- POJ 2228 Naptime(DP+环形处理)
题解 这题一眼望去DP. 发现自己太智障了. 这题想的是O(n^3m)的. 环形处理只会断环成链....然后DP也想的不好. 我们先考虑如果除去环这题该怎么做? dp[i][j][0/1]代表到第i小 ...
- POJ 2228 naptime
环形DP 先考虑如果只是一天,我们可以用线性DP写出转移方程,注意初始化 如果是一个环的话,我们发现少了一种第n天和第一天连起来的情况,那么我们就再进行一次DP 强制这种情况 #include < ...
- BZOJ3875--骑士游戏(SPFA处理带后效性的动态规划)
3875: [Ahoi2014]骑士游戏 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 181 Solved: 91[Submit][Status] ...
- luogu 4042 有后效性的dp
存在有后效性的dp,但转移方程 f[i] = min( f[i], s[i] + sigma f[j] ( j 是后效点) ) 每次建当前点和 转移点的边 e1, 某点和其会影响的点 e2 spfa ...
- Educational Codeforces Round 62 E 局部dp + 定义状态取消后效性
https://codeforces.com/contest/1140/problem/E 局部dp + 定义状态取消后效性 题意 给你一个某些位置可以改变的字符串,假如字符串存在回文子串,那么这个字 ...
- Luogu P2973 [USACO10HOL]赶小猪Driving Out the Piggi 后效性DP
有后效性的DP:$f[u]$表示到$u$的期望次数,$f[u]=\Sigma_{(u,v)} (1-\frac{p}{q})*f[v]*deg[v]$,最后答案就是$f[u]*p/q$ 刚开始$f[1 ...
- Cogs 376. [IOI2002]任务安排(后效性DP)
[IOI2002]任务安排 ★☆ 输入文件:batch.in 输出文件:batch.out 简单对比 时间限制:1 s 内存限制:128 MB N个任务排成一个序列在一台机器上等待完成(顺序不得改变) ...
- Codeforces - 24D 有后效性的DP处理
题意:在n*m的网格中,某个物体初始置于点(x,y),每一步行动都会等概率地停留在原地/往左/往右/往下走,求走到最后一行的的步数的数学期望,其中n,m<1000 lyd告诉我们这种题目要倒推处 ...
随机推荐
- xmpp 登录注册小结
将XMPPStream放在APPDelegate,以便全局访问 #pragma mark - XMPP相关的属性和方法定义 /** * 全局xmppstream,只读属性 */ @property ( ...
- “a++” 与 “++a” 的区别
很久不写 C++ 程序,今天测试一段代码的过程中,发现自己连最基础的 C++ 知识都忘了,汗!!! a++ 与 ++a 都是表达式,他们都有值.其中: 1)a++ 的值是 a 的原始值,这个表达式的功 ...
- Admin组件-----Django自带
1 list_display from django.contrib import admin # Register your models here. from app01.models impor ...
- 棋盘制作 BZOJ 1057
棋盘制作 [问题描述] 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴 ...
- 更改UISwitch大小
UISwitch大小总是改不了...找了一个简便方法. mySwitch = [[UISwitch alloc] initWithFrame: CGRectMake( width - 55, hei ...
- 关于整合spring+mybatis 第三种方式-使用注解
使用注解 1.与前两种方法一致.不过稍许不同的是beans.xml中配置的差异. <!-- 配置sqlSessionFactory --> <bean id="sqlSes ...
- hdu4848 求到达每个点总时间最短(sum[d[i]])。
开始的时候是暴力dfs+剪枝,怎么也不行.后来参考他人思想: 先求出每个点之间的最短路(这样预处理之后的搜索就可以判重返回了),截肢还是关键:1最优性剪枝(尽量最优:目前的状态+预计还有的最小时间&g ...
- [bzoj3308]九月的咖啡店_欧拉筛素数_费用流
bzoj-3308 九月的咖啡店 题目大意:深绘里在九份开了一家咖啡让,如何调配咖啡民了她每天的头等大事我们假设她有N种原料,第i种原料编号为i,调配一杯咖啡则需要在这里若干种兑在一起.不过有些原料不 ...
- codeforces #463
D(树上倍增) 题意: 刚开始有一个点1,权值为0. 接下来有q个操作,每个操作有两种: 1 R W:新加一个点,这个点的权值为W,这个点的父亲是R 2 R X:在从点R到1的路径上,取出从R开始的不 ...
- Maven项目配置外部依赖(本地依赖)
加入有一些公共jar包只限于公司内部使用,不能暴露在外部时,有如下的方案: 1.搭建私有远程仓库(nexus) 2.使用http.ftp.共享地址,github地址等(主要是通过maven-deplo ...