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. 5.0.1版本的react-router-dom路由传参以及路由表的配置和接收页面的接受

    //第一种 通过问号传参 //发送 this.props.history.push("/detail?id="+item.downurl) //路由表配置 <Route pa ...

  2. tensorflow 卷积层

    TensorFlow 卷积层   让我们看下如何在 TensorFlow 里面实现 CNN. TensorFlow 提供了 tf.nn.conv2d() 和 tf.nn.bias_add() 函数来创 ...

  3. thinkphp 清理runtime缓存的方法, 清理指定目录

    https://blog.csdn.net/qq_22823581/article/details/79081497 hinkphp 清理runtime缓存的方法, 清理指定目录 function d ...

  4. oracle计算记录条数

    和一般的观点相反, count(*) 比count(1)稍快 , 当然如果可以通过索引检索,对索引列的计数仍旧是最快的. 例如 COUNT(EMPNO)

  5. iPython的安装过程

    http://blog.csdn.net/u012587561/article/details/50900781 python2.7.10 amd64 win10 x64 1. 安装setuptool ...

  6. Pytorch实现MNIST(附SGD、Adam、AdaBound不同优化器下的训练比较) adabound实现

     学习工具最快的方法就是在使用的过程中学习,也就是在工作中(解决实际问题中)学习.文章结尾处附完整代码. 一.数据准备  在Pytorch中提供了MNIST的数据,因此我们只需要使用Pytorch提供 ...

  7. 从 SGD 到 Adam —— 深度学习优化算法概览(一) 重点

    https://zhuanlan.zhihu.com/p/32626442 骆梁宸 paper插画师:poster设计师:oral slides制作人 445 人赞同了该文章 楔子 前些日在写计算数学 ...

  8. JS获取手机型号和系统

    废话不多说,直接上源码 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&q ...

  9. phpstorm 中git 的使用

    phpstorm 是一款不可多得的IDE 环境,它既是一款强大的编辑器,还是一款调试器,同时还是一款git 可视化管理工具哟,phpers 值得拥有.今天介绍的是他不为人知的强大功能 —— git. ...

  10. mysql 第三课 jdbc基础操作

    jdbc连接可以大致分为5步: 1.注册驱动 2.获取连接 3.编写语句 4.执行语句 5.关闭连接 其中可以设置参数等等. 1.我们先建一个项目目录: 其中com.etc.dao为数据访问对象 co ...