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 移动键Q的三种用法 For Mac,Windows类同
拖动整个场景:三指 (任何模式下)ALT+三指:旋转当前镜头 (任何模式下)双指前后滑动:缩放镜头 ps1:Q键移动的游戏场景,W移动的是游戏对象 ps2:三指 = 左键拖动
- 页面定制CSS代码初探(一):页面变宽 文本自动换行 图片按比缩放
初识博客 初写博客,先在设置里选了个喜欢的模板 第一眼就爱上了呢!那极简的风格,我喜欢!!但是,应用后,却发现... 纳尼!模板上右侧那张漂亮的图片呢?!我的怎么什么都没有.没有图片好难看啊,瞬间无爱 ...
- node——Commonjs
ECMA只规范了js最近的一些能力,并没有规范当要用js写一个庞大的项目如果使用模块化开发. CommonJS规范了当我们想开发大型程序的时候如何模块化来开发,以及模块化的时候,不同文件的通讯. Co ...
- JS中的与冒号的作用、箭头函数相关的一道题
相关知识来自于一道题: 使用ES6的箭头函数语法可以直接省略 function 和 return 关键字,比如 function (){return 1;} 就可以简化成 () => 1 , 但 ...
- C# Windows Api的一些方法 封装 以及 常用参数
using System;using System.Collections.Generic;using System.Drawing;using System.Diagnostics;using Sy ...
- Cannot find a free socket for the debugger
win + R 输入cmd netsh winsock reset 重启电脑,重启MyEclipse,可以正常Debug了. 部分电脑可以=============================== ...
- openvswith Frequently Asked Questions
Open vSwitch <http://openvswitch.org> 参考地址:http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=ope ...
- JavaScript中的基础测试题
Java ...
- https的基本原理,看完你的程序员女朋友再也不和你提分手了
[http风险] 首先,我们来讲一下平时上网的时候,存在的风险. 初步接触过网络的同学都知道,网络上是很不安全的,尤其是各种公共场合的免费WIFI,以及手机上各种免费上网的万能钥匙.这些不安全因素会导 ...
- MyBatis学习总结(5)——实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...