$ 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. Mysql 主外键与索引之间的区别和联系

    系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识一行. 作为一个可以被外键有效引用的对象. 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部 ...

  2. 【Luogu】P1941飞扬的小鸟(DP)

    我发现现在没了题解我做普及提高+的题也做不了 更不要说这些提高+难度的‍题 此题是一个二维DP.暴力是三重循环ijk,k枚举在i位置上的点击次数.即 for(int i=1;i<=n;++i) ...

  3. BZOJ 3227 [Sdoi2008]红黑树(tree) ——贪心 动态规划

    首先可以想到一个贪心的方法,然后一层一层的合并. 也可以采用动态规划的方式,为了写起来好写,把点数*2+1,然后发现在本机上跑不过1500的数据. 交上去居然A掉了. 贪心 #include < ...

  4. 常州模拟赛d2t1 小X的质数

    题目背景 小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的 情感.小 X 认为,质数是一切自然数起源的地方. 题目描述 在小 X 的认知里,质数是除了本身和 1 以外,没有其他因 ...

  5. Windows下ElasticSearch的使用方式 CURL+Cygwin+Head插件

    Windows使用ElasticSearch的命令方法 一.CURL(不推荐) 下载curl安装包,解压到指定目录,在命令行运行解压后的exe文件. 二.Cygwin(推荐) 安装Windows下类l ...

  6. 【SPOJ687&POJ3693】Maximum repetition substring(后缀数组)

    题意: n<=1e5 思路: From http://hzwer.com/6152.html 往后匹配多远 r 用ST表求lcp即可...往前 l 就把串反过来再做一下.. 但是有可能求出来的最 ...

  7. linux 查看自己所在的公网ip

    curl members.3322.org/dyndns/getip 其他的方法还有: curl icanhazip.com curl ifconfig.me curl curlmyip.com cu ...

  8. 【mac】mac上安装JDK

    安装步骤就是在Oracle官网下载你想要的JDK版本下载,下载的时候同意协议即可 这里就给出jdk安装的位置 还有一点要注意的是,在指定JVM的位置的时候,需要指定到home目录下

  9. JavaScript对列表节点的操作:删除指定节点、删除最后一个节点、删除第一个节点、删除所有节点、增加节点

    使用菜鸟的运行环境直接测试:http://www.runoob.com/try/try.php?filename=tryjs_events <!DOCTYPE html> <html ...

  10. github/gitlab ssh-keys全局唯一

    我们知道,通过在gitlab.github上设置ssh-key,可以直接拉取代码:git clone …… 公司为了代码安全,会对代码访问权限进行控制,不同人有不同代码的访问权限. 有时候,为了临时获 ...