$ 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的后效性处理)的更多相关文章

  1. poj 2228 Naptime dp

    这个题目的状态还是比较好想的,dp[i][j]表示已经睡了i个时段,最后睡在j时段的最优值,但是需要处理环的情况,我的做法是算两次,第一次不处理环,第二次强制性要求第一个时段需要睡,然后查看dp[m] ...

  2. POJ 2228 Naptime(DP+环形处理)

    题解 这题一眼望去DP. 发现自己太智障了. 这题想的是O(n^3m)的. 环形处理只会断环成链....然后DP也想的不好. 我们先考虑如果除去环这题该怎么做? dp[i][j][0/1]代表到第i小 ...

  3. POJ 2228 naptime

    环形DP 先考虑如果只是一天,我们可以用线性DP写出转移方程,注意初始化 如果是一个环的话,我们发现少了一种第n天和第一天连起来的情况,那么我们就再进行一次DP 强制这种情况 #include < ...

  4. BZOJ3875--骑士游戏(SPFA处理带后效性的动态规划)

    3875: [Ahoi2014]骑士游戏 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 181  Solved: 91[Submit][Status] ...

  5. luogu 4042 有后效性的dp

    存在有后效性的dp,但转移方程 f[i] = min( f[i], s[i] + sigma f[j] ( j 是后效点) ) 每次建当前点和 转移点的边 e1, 某点和其会影响的点 e2 spfa ...

  6. Educational Codeforces Round 62 E 局部dp + 定义状态取消后效性

    https://codeforces.com/contest/1140/problem/E 局部dp + 定义状态取消后效性 题意 给你一个某些位置可以改变的字符串,假如字符串存在回文子串,那么这个字 ...

  7. 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 ...

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

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

  9. Codeforces - 24D 有后效性的DP处理

    题意:在n*m的网格中,某个物体初始置于点(x,y),每一步行动都会等概率地停留在原地/往左/往右/往下走,求走到最后一行的的步数的数学期望,其中n,m<1000 lyd告诉我们这种题目要倒推处 ...

随机推荐

  1. Kubernetes对象

    Kubernetes对象 在之前的文章已经讲到了很多Kubernets对象,包括pod,service,deployment等等.Kubernets对象是一种持久化,表示集群状态的实体.它是一种声明式 ...

  2. C++ 中new

    operator new在C++中的各种写法 (2011-09-21 14:59:33) 标签: 杂谈   乍一看,在C++中动态分配内存很简单:new是分配,delete是释放,就这么简单.然而,这 ...

  3. PHP的Trait机制

    PHP的Trait机制 Trait介绍: 1.自PHP5.4起,PHP实现了一种代码复用的方法,称为trait.2.Trait是为类似PHP的单继承语言二准备的一种代码复用机制.3.Trait为了减少 ...

  4. python(3)- 常用快捷键及基础命令

  5. 洛谷 P1503鬼子进村

    题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. 题目描述 描述 县城里 ...

  6. Spring中使用byName实现Beans自动装配

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/beans-auto-wiring/spring-autowiring-byname.html: 此 ...

  7. Linux下使用curl进行http请求(转)

    curl在Linux下默认已经安装,Windows需要自行安装. 下载地址:https://curl.haxx.se/download.html Windows离线版本:链接:http://pan.b ...

  8. XSS学习分支图

    转载请注明出处:http://blog.csdn.net/cym492224103 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2 ...

  9. ProFTPD配置匿名登录与文件夹訪问权限控制

    对ProFTPDserver配置匿名登录.         查看配置文件proftpd.conf.默认情况下配置文件里的.匿名登录配置User和Group均为ftp. 查看/etc/passwd确认用 ...

  10. vue2.0 常用的 UI 库

    1.mint-ui 安装: npm install mint-ui --save 使用: main.js // MintUI组件库 import MintUI from 'mint-ui' impor ...