题解

这题一眼望去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+环形处理)的更多相关文章

  1. poj 2228 Naptime dp

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

  2. poj 2228 Naptime(DP的后效性处理)

    \(Naptime\) \(solution:\) 这道题不做多讲,它和很多区间DP的套路一致,但是这一道题它不允许断环成链,会超时.但是我们发现如果这只奶牛跨夜休息那么它在不跨夜的二十四个小时里一定 ...

  3. POJ 2228 naptime

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

  4. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

  5. poj上的dp专题

    更新中... http://poj.org/problem?id=1037 dp[i][j][0]表示序列长度为i,以j开始并且前两位下降的合法序列数目; dp[i][j][1]表示序列长度为i, 以 ...

  6. POJ 2096 (概率DP)

    题目链接: http://poj.org/problem?id=2096 题目大意:n种bug,s个子系统.每天随机找一个bug,种类随机,来自系统随机.问找齐n种bug,且每个子系统至少有一个bug ...

  7. poj 1463(树形dp)

    题目链接:http://poj.org/problem?id=1463 思路:简单树形dp,如果不选父亲节点,则他的所有的儿子节点都必须选,如果选择了父亲节点,则儿子节点可选,可不选,取较小者. #i ...

  8. poj 2486( 树形dp)

    题目链接:http://poj.org/problem?id=2486 思路:经典的树形dp,想了好久的状态转移.dp[i][j][0]表示从i出发走了j步最后没有回到i,dp[i][j][1]表示从 ...

  9. poj 3140(树形dp)

    题目链接:http://poj.org/problem?id=3140 思路:简单树形dp题,dp[u]表示以u为根的子树的人数和. #include<iostream> #include ...

随机推荐

  1. 前端精选文摘:css之BFC 神奇背后的原理(转载)

    一.BFC是什么? 在解释 BFC 是什么之前,需要先介绍 Box.Formatting Context的概念. Box: CSS布局的基本单位 Box 是 CSS 布局的对象和基本单位, 直观点来说 ...

  2. (转)JobTracker和TaskTracker概述

    一 概述: (1)Hadoop MapReduce采用Master/Slave结构. *Master:是整个集群的唯一的全局管理者,功能包括:作业管理.状态监控和任务调度等,即MapReduce中的J ...

  3. 路飞学城Python-Day20(元类的练习题)

    练习一:在元类中控制把自定义类的数据属性都变成大写 class MyDef(type): def __new__(cls, class_name, class_attr, class_dic): up ...

  4. linux--rbtree 解惑 insert

    rbtree.txt 中insert 操作,为何用2级指针?? 2级指针用的还是不熟.心虚. Inserting data in the tree involves first searching f ...

  5. 【Python 学习】通过while循环和for循环猜测年龄

    Python中可以通过while和for循环来限制猜测年龄的次数 1. 在猜测年龄的小程序中,不加循环的代码是这样的: age_of_yu = 23 guess_age = int(input(&qu ...

  6. intellij idea 打开两个 terminal

    intellij idea 打开两个  terminal alt+f12可以打开terminal,在terminal窗口左侧点击绿色的加号,就可以又打开一个terminal,用tab标签展示:

  7. 【c语言】输入一个递增排序的数组的一个旋转,输出旋转数组中的最小元素

    //旋转数组的最小数字 //题目:把一个数组最開始的若干个元素搬到数组的末尾.我们称之为数组的旋转. //输入一个递增排序的数组的一个旋转.输出旋转数组中的最小元素. //比如:数组{3.4,5,1, ...

  8. UVALive 4222 /HDU 2961 Dance 大模拟

    Dance Problem Description For a dance to be proper in the Altered Culture of Machinema, it must abid ...

  9. NOIP2017提高组模拟赛4 (总结)

    NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...

  10. sql server执行动态拼接sql(带传参数)和去掉小数点后0的函数

    1 exec sp_executesql N'SELECT 2 [Extent2].[Id] AS [Id], 3 [Extent2].[Name] AS [Name], 4 [Extent2].[D ...