POJ 2228 Naptime(DP+环形处理)
题解
这题一眼望去DP。
发现自己太智障了。
这题想的是O(n^3m)的。
环形处理只会断环成链。。。。然后DP也想的不好。
我们先考虑如果除去环这题该怎么做?
dp[i][j][0/1]代表到第i小时睡了j个小时,第i小时睡了/没睡权值最大值。
初值
dp[1][1][1]=dp[1][0][0]=0;dp[i][0][0]=0;其余都是负无穷。
转移
dp[i][j][1]=max(dp[i-1][j-1][0],do[i-1[j-1][2]+w[i]);
dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j[1]);
目标
dp[n][m][1].dp[n][m][0];
然后考虑环,我们发现我们少考虑的只是第一个小时和上一天最后一个小时都睡觉的情况。
我们保证第一个小时和上一天最后一个小时都睡觉再做一次DP。
初值
dp[1][1][1]=a[1];dp[i][0][0]=0;其余都是负无穷。
转一样
目标
dp[n][m][1]];
这样我们做两次DP,就处理了环的情况。
注意这题空间比较少,滚一下就好了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=;
const int INF=;
int n,m,a[N],dp[][N][],ans;
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
memset(dp,-,sizeof(dp));dp[][][]=dp[][][]=;
for(int i=;i<=n;i++){
dp[i&][][]=;
for(int j=;j<=min(m,i);j++){
dp[i&][j][]=max(dp[i&^][j-][]+a[i],dp[i&^][j-][]);
dp[i&][j][]=max(dp[i&^][j][],dp[i&^][j][]);
}
}
ans=max(dp[n&][m][],dp[n&][m][]);
memset(dp,-,sizeof(dp));dp[][][]=a[];
for(int i=;i<=n;i++){
dp[i&][][]=;
for(int j=;j<=min(m,i);j++){
dp[i&][j][]=max(dp[i&^][j-][]+a[i],dp[i&^][j-][]);
dp[i&][j][]=max(dp[i&^][j][],dp[i&^][j][]);
}
}
printf("%d",max(ans,dp[n&][m][]));
return ;
}
POJ 2228 Naptime(DP+环形处理)的更多相关文章
- poj 2228 Naptime dp
这个题目的状态还是比较好想的,dp[i][j]表示已经睡了i个时段,最后睡在j时段的最优值,但是需要处理环的情况,我的做法是算两次,第一次不处理环,第二次强制性要求第一个时段需要睡,然后查看dp[m] ...
- poj 2228 Naptime(DP的后效性处理)
\(Naptime\) \(solution:\) 这道题不做多讲,它和很多区间DP的套路一致,但是这一道题它不允许断环成链,会超时.但是我们发现如果这只奶牛跨夜休息那么它在不跨夜的二十四个小时里一定 ...
- POJ 2228 naptime
环形DP 先考虑如果只是一天,我们可以用线性DP写出转移方程,注意初始化 如果是一个环的话,我们发现少了一种第n天和第一天连起来的情况,那么我们就再进行一次DP 强制这种情况 #include < ...
- Fire (poj 2152 树形dp)
Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...
- poj上的dp专题
更新中... http://poj.org/problem?id=1037 dp[i][j][0]表示序列长度为i,以j开始并且前两位下降的合法序列数目; dp[i][j][1]表示序列长度为i, 以 ...
- POJ 2096 (概率DP)
题目链接: http://poj.org/problem?id=2096 题目大意:n种bug,s个子系统.每天随机找一个bug,种类随机,来自系统随机.问找齐n种bug,且每个子系统至少有一个bug ...
- poj 1463(树形dp)
题目链接:http://poj.org/problem?id=1463 思路:简单树形dp,如果不选父亲节点,则他的所有的儿子节点都必须选,如果选择了父亲节点,则儿子节点可选,可不选,取较小者. #i ...
- poj 2486( 树形dp)
题目链接:http://poj.org/problem?id=2486 思路:经典的树形dp,想了好久的状态转移.dp[i][j][0]表示从i出发走了j步最后没有回到i,dp[i][j][1]表示从 ...
- poj 3140(树形dp)
题目链接:http://poj.org/problem?id=3140 思路:简单树形dp题,dp[u]表示以u为根的子树的人数和. #include<iostream> #include ...
随机推荐
- Unity 默认进入的scenes
1,如果有多个场景,那么第一个场景要放在最上边,(其他的也要加) 2,如果不添加,那么Unity会把当前打开的场景添加进来. 3,切换场景的代码 using UnityEngine.SceneMana ...
- 安装django和selenium
安装很简单(前提是python已经安装),命令窗口直接输入pip install django,回车就会自动进行安装,selenium也是一样pip install selenium 启动django ...
- vector的resize与reserve的区别
- jq——动画
基本 1 show(可加时间)显示[在效果完成后可执行函数] 2 hide(可加时间)隐藏 3 toggle():切换效果 [在show和hide中切换] 有函数时 滑动动画 1 slideDown: ...
- IOS - 6\7下UINavigationBar的颜色的方法改变 ——转载http://www.th7.cn/Program/IOS/201310/155057.shtml
IOS7下设置UINavigationBar的颜色的方法已经改变(当然如果是用自定义图片的话请忽略---) 首先是区别iOS7和之前版本的方法如下: //如果是iOS7以前的话if (floor(NS ...
- 用Arcade表达式添加标签
Arcade表达式是轻量级的脚本语言,我们可以通过全局变量$feature获取要素属性.比如说,要为城市添加标签,利用CITY_NAME列,我们可以编写语句:$feature.CITY_NAME.Ar ...
- Extjs toolbar 如何添加竖杆分隔符
如下: { xtype:'button', text:'学生档案', iconCls:'file', handler:function(){ console.log(222) }, }, {xtype ...
- SQL注入、占位符拼接符
一.什么是SQL注入 官方: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意 ...
- 不用@Value从Spring的ApplicationContext中获取一个或全部配置
获取一个配置: applicationContext.getEnvironment().resolvePlaceholders("${propertyKey}"); // 方法1 ...
- Pointcut is not well-formed: expecting 'name pattern' at character position 36
Pointcut is not well-formed: expecting 'name pattern' at character position 36 学习了:http://blog.csdn. ...