Analysis

首先假设一天的第N小时与后一天的第一个小时不相连, 这种情况下DP转移比较好想

dp[i][j][0/1]dp[i][j][0/1]表示

考虑一天的前i个小时,已经休息了j小时,且第i个小时是否在休息

那么有状态转移方程:

dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]);

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

初始化为dp[1][0][0]=dp[1][1][1]=0dp[1][0][0]=dp[1][1][1]=0, 其余为-inf−inf

答案为max(dp[n][b][0],dp[n][b][1])max(dp[n][b][0],dp[n][b][1])

现在再考虑一天的第N小时与后一天的第一个小时相连

我们发现上述转移中, 唯一没考虑到的情况只有第1个小时休息能获得体力

于是我们可以初始化dp[1][1][1]=U_1dp[1][1][1]=U1​, 转移方程与上述相同

那么答案为dp[n][b][1]dp[n][b][1](即强制最后一小时休息令第一小时能获得体力), 和前一次dp的答案比较即可得到最终结果

到此为止在这里已经可以AC, 但是!!!如果我们拿到POJ上提交, 你会发现自己疯狂MLE(POJ丧心病狂的Memory limit只有64M)

于是我们考虑用滚动数组优化空间

dp[i&1][j][0]=max(dp[(i-1)&1][j][0],dp[(i-1)&1][j][1]);

dp[i&1][j][1]=max(dp[(i-1)&1][j-1][0],dp[(i-1)&1][j-1][1]+a[i]);

因为dp[i][][]只与dp[i-1][][]有关, 所以只要交替使用数组第0维和第1维, 只保存上一次更新的dp数组, 即可大幅优化空间

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define maxn 3830+10
using namespace std;
inline int read()
{
int x=;
bool f=;
char c=getchar();
for(; !isdigit(c); c=getchar()) if(c=='-') f=;
for(; isdigit(c); c=getchar()) x=(x<<)+(x<<)+c-'';
if(f) return x;
return -x;
}
inline void write(int x)
{
if(x<){putchar('-');x=-x;}
if(x>)write(x/);
putchar(x%+'');
}
int n,b,ans;
int u[maxn];
int dp1[][maxn][],dp2[][maxn][];
signed main()
{
// freopen("naptime.in","r",stdin);
// freopen("naptime.out","w",stdout);
n=read();b=read();
for(int i=;i<=n;i++) u[i]=read();
memset(dp1,,sizeof(dp1));
dp1[][][]=dp1[][][]=;
memset(dp2,,sizeof(dp2));
dp2[][][]=u[];
for(int i=;i<=n;i++)
{
for(int j=;j<=min(i,b);j++)
{
dp1[i&][j][]=max(dp1[(i-)&][j][],dp1[(i-)&][j][]);
if(j>=) dp1[i&][j][]=max(dp1[(i-)&][j-][],dp1[(i-)&][j-][]+u[i]);
dp2[i&][j][]=max(dp2[(i-)&][j][],dp2[(i-)&][j][]);
if(j>=) dp2[i&][j][]=max(dp2[(i-)&][j-][],dp2[(i-)&][j-][]+u[i]);
}
}
ans=max(dp2[n&][b][],max(dp1[n&][b][],dp1[n&][b][]));
write(ans);
return ;
}

请各位大佬斧正(反正我不认识斧正是什么意思)

Acwing P288 休息时间 题解的更多相关文章

  1. AcWing 288. 休息时间

    传送门 思路: 考虑DP,设dp[i][j][1]为牛在前小时休息j个小时且第i个小时休息时,回复的最多体力:dp[i][j][0]为牛在前小时休息j个小时且第i个小时没有休息时,回复的最多体力. 可 ...

  2. T4 分配时间 题解

    问题描述 小王参加的考试是几门科目的试卷放在一起考,一共给 t 分钟来做.他现在已经知道每 门科目花的时间和得到的分数的关系,还有写名字要的时间(他写自己的名字很慢)请帮他 算一下他最高能得几分.总分 ...

  3. py3,休息时间玩点小把戏

    100以内奇数: ls = [x for x in range(100) if x % 2 == 1] 100以内偶数: ls = list(x for x in range(100) if x % ...

  4. LOJ6346:线段树:关于时间 ——题解

    https://loj.ac/problem/6346 题目还是没法粘贴…… 一道蛮不错的题. 老年选手困了30min后才想要推式子实在是太懒了…… 我们可以对每次更新列表看成系数*x即可. 举例:第 ...

  5. Acwing P274 移动服务 题解

    每日一题 day21 打卡 Analysis DP的状态为已经完成的请求数量,通过指派一位服务员可以把”完成i - 1个请求的状态”转移到”完成i个请求的状态”那么我们可以知道转移从dp[i - 1] ...

  6. AcWing P173 矩阵距离 题解

    Analysis 就是一个裸的广搜,每次从是1的点开始找就好啦~~~ #include<iostream> #include<cstdio> #include<cstri ...

  7. AcWing P165 小猫爬山 题解

    Analysis 这道题是搜索,类似于小木棍,加一些剪枝. 第一个剪枝是如果当前的答案已经大于了我们已知的最小答案,不用说直接return返回即可. 第二个剪枝是我们可以将小猫的体重从大到小排序,这样 ...

  8. AcWing P164 可达性统计 题解

    Analysis 这道题我一开始想到的是传递闭包,但是时间复杂度是n³,也开不下30000*30000的数组,所以我想到了拓扑+状态压缩(bitset),从后往前找,把能到达的点能到哪里用位运算赋到上 ...

  9. AcWing P378 骑士放置 题解

    Analysis 这道题跟前几道题差不多,依旧是匈牙利算法求二分图匹配,在连边的时候,要连两个矛盾的位置(即一个骑士和其控制的位置).然后就跑一遍匈牙利算法就好了. #include<iostr ...

随机推荐

  1. gdocrimg04从库无法重启问题

    1.查看error.logVersion: '5.6.25-log'  socket: '/tmp/mysqld.3324_gdocrimg04.sock'  port: 3324  Source d ...

  2. 【IDEA使用技巧】(4) —— IDEA 构建Java Maven项目、导入Eclipse项目、多Module Maven项目

    1.IntelliJ IDEA构建Java Maven项目 1.1. IDEA构建Java Maven项目 ①选择Create New Project,选择创建Maven项目,并勾选Create fr ...

  3. redis复制机制

    摘自redis设计与实现 通过客户端,发送slave of xxx给redis从服务器,即可实现主从服务器之间的复制.如果主服务器设置了requirepass进行身份验证,从服务器需要设置master ...

  4. centos7 设置静态ip , 并开机联网

    修改 /etc/sysconfig/network-scripts 下的文件 我的是ens32 (不同系统这个文件名字不一样) 内容如下 TYPE=Ethernet PROXY_METHOD=none ...

  5. quartz2.3.0(十二)通过RMI协议向Scheduler调度器远程添加job任务

    此代码示例通过RMI协议向Scheduler调度器远程添加job任务. 代码文件包括:job任务类(SimpleJob.java).RMI服务端server类(RemoteServerExample. ...

  6. CCF 2016-12-1 工资计算

    CCF 2016-12-1 工资计算 题目 问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交 ...

  7. Python之TensorFlow的变量收集、自定义命令参数、矩阵运算、梯度下降-4

    一.TensorFlow为什么要存在变量收集的过程,主要目的就是把训练过程中的数据,比如loss.权重.偏置等数据通过图形展示的方式呈现在开发者的眼前. 自定义参数:自定义参数,主要是通过Python ...

  8. .net core使用ocelot---第五篇 服务质量

    简介 .net core使用ocelot---第一篇 简单使用  .net core使用ocelot---第二篇 身份验证使用 .net core使用ocelot---第三篇 日志记录  .net c ...

  9. webapp之登录页面当input获得焦点时,顶部版权文本被顶上去 的解决方法

    如上图,顶部版权是用绝对定位写的,被顶上去了,解决方法是判断屏幕大小,改变footer的定位方式: <script> var oHeight = $(document).height(); ...

  10. Angular配置路由以及动态路由取值传值跳转

    Angular配置路由 1.找到 app-routing.module.ts 配置路由 引入组件 import { HomeComponent } from './home/home.componen ...