Luogu

一定要记得初始化为-inf!!!

Description

在某个星球上,一天由N小时构成。我们称0-1点为第一个小时,1-2点为第二个小时,以此类推。在第i个小时睡觉能恢复Ui点体力。在这座星球上住着一头牛,它每天要休息B个小时,它休息的这B个小时可以不连续,可以分成若干段,但是在每一段的第一个小时不能恢复体力,从第二个小时开始才可以恢复体力。
为了身体健康,这头牛希望遵循生物钟,每天采用相同的睡觉计划。另外,因为时间是连续的,每天的第N个小时与下一天的第一个小时是相连的,这头牛只需要在N个小时内休息B个小时就够了。
请你给这头牛安排一个任务计划,使得它每天恢复的体力最多。

Sol

环形DP,第一反应是断环为链

所以这里就不讲断环为链了,讲一个另外的方法

考虑更简单的问题,假设第n个小时与第1个小时不是连续的,即问题是线性的

阶段与状态:f[i][j][0/1]表示1~i小时内睡了j个小时,第i小时睡了/没睡的最大恢复体力值

转移:f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1])

   f[i][j][1]=max(f[i-1][j-1][0],f[i-1][j-1][1]+a[i])

初始:f[i][j][0/1]=inf;f[1][1][1]=f[1][0][0]=0;

注意到,线性其实只比环少了一种情况,就是第1个小时与第n个小时都在睡觉的情况.

那么我们在线性解题的基础上加上这一情况即可

具体来说,先执行一遍DP,然后强行让牛在第n小时睡觉,即f[1][1][1]=a[1],再DP一次,用f[n][B][1]更新答案就可以了

还有,这题可以用滚动数组优化啊!

Code

 #include<iostream>
#include<cstdio>
#include<cstring>
#define Rg register
#define il inline
#define db double
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a));
#define go(i,a,b) for(Rg int i=a;i<=b;++i)
#define yes(i,a,b) for(Rg int i=a;i>=b;--i)
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
const int N=;
int T,n,B,ans,a[N],f[N][N][];
il void dp()
{
go(i,,n)
go(j,,min(i,B))
{
if(i!=j)f[i][j][]=max(f[i-][j][],f[i-][j][]);
if(j==)f[i][j][]=f[i-][j-][];
else f[i][j][]=max(f[i-][j-][],f[i-][j-][]+a[i]);
}
}
int main()
{
T=read();
while(T--)
{
n=read(),B=read();
go(i,,n)a[i]=read();
mem(f,);f[][][]=f[][][]=;
go(i,,n)f[i][][]=;
dp();ans=max(f[n][B][],f[n][B][]);
mem(f,);f[][][]=a[];
go(i,,n)f[i][][]=;
dp();ans=max(ans,f[n][B][]);
printf("%d\n",ans);
}
return ;
}

随机推荐

  1. Oracle函数——TO_DATE

    TO_DATE 含义:将具有固定格式的字符串类型的数据转化为相对应的Date类型数据,官网解释如下图   使用方法 TO_DATE("需要转换的字符串","日期格式&qu ...

  2. C# Find vs FirstOrDefault

    本文告诉大家,在获得数组第一个元素时,使用哪个方法性能更高. 需要知道,两个方法都是 Linq 的方法,使用之前需要引用 Linq .对于 List 等都是继承可枚举Enumerable这时获取第一个 ...

  3. @topcoder - SRM697D1L3@ ConnectedStates

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 有n个城市,每个城市有个权值wi,任意两个城市i,j之间的道路数 ...

  4. 为什么有时候Css样式表某个属性引用不成功?

    首次使用博客,很多东西都在探索,第一篇文章也不知道发布点什么,就随便写写,是在word里面写的,也懒得排版,将就这用吧. 闲着没事找了酷狗的API写了个简单的静态网页,完成了搜索,展示,播放功能.就想 ...

  5. 54个提高PHP程序运行效率的方法

    1.在可以用file_get_contents替代file.fopen.feof.fgets等系列方法的情况下,尽量用 file_get_contents,因为他的效率高得多!但是要注意file_ge ...

  6. RegExp类型

    一.创建正则表达式的方法 1.字面量形式 var expressiion=/pattern/flags; flags:g全局模式,即将被应用于所有字符串,而非在发现第一个匹配项时立即停止: i不区分大 ...

  7. H3C 虚拟模板方式配置PPP MP

  8. [转]【译】.NET Core 3.0 中的新变化

    .NET Core 3.0 是 .NET Core 平台的下一主要版本.本文回顾了 .Net Core 发展历史,并展示了它是如何从基本支持 Web 和数据工作负载的版本 1,发展成为能够运行 Web ...

  9. Native memory allocation (mmap) failed to map 142606336 bytes for committing reserved memory.

    这里写链接内容 问题描述 Java程序运行过程中抛出java.lang.OutOfMemoryError: unable to create new native thread,如下所示: [java ...

  10. python进阶之异常处理

    异常处理 在代码运行时,会因为各种原因出现bug,而程序遇到bug就会中断运行,而在日常生产中程序是要长时间运行不能随意中断的.因此就需要我们提前做好异常处理. 异常 print(x) # 一般报错就 ...