Acwing P288 休息时间 题解
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 休息时间 题解的更多相关文章
- AcWing 288. 休息时间
传送门 思路: 考虑DP,设dp[i][j][1]为牛在前小时休息j个小时且第i个小时休息时,回复的最多体力:dp[i][j][0]为牛在前小时休息j个小时且第i个小时没有休息时,回复的最多体力. 可 ...
- T4 分配时间 题解
问题描述 小王参加的考试是几门科目的试卷放在一起考,一共给 t 分钟来做.他现在已经知道每 门科目花的时间和得到的分数的关系,还有写名字要的时间(他写自己的名字很慢)请帮他 算一下他最高能得几分.总分 ...
- py3,休息时间玩点小把戏
100以内奇数: ls = [x for x in range(100) if x % 2 == 1] 100以内偶数: ls = list(x for x in range(100) if x % ...
- LOJ6346:线段树:关于时间 ——题解
https://loj.ac/problem/6346 题目还是没法粘贴…… 一道蛮不错的题. 老年选手困了30min后才想要推式子实在是太懒了…… 我们可以对每次更新列表看成系数*x即可. 举例:第 ...
- Acwing P274 移动服务 题解
每日一题 day21 打卡 Analysis DP的状态为已经完成的请求数量,通过指派一位服务员可以把”完成i - 1个请求的状态”转移到”完成i个请求的状态”那么我们可以知道转移从dp[i - 1] ...
- AcWing P173 矩阵距离 题解
Analysis 就是一个裸的广搜,每次从是1的点开始找就好啦~~~ #include<iostream> #include<cstdio> #include<cstri ...
- AcWing P165 小猫爬山 题解
Analysis 这道题是搜索,类似于小木棍,加一些剪枝. 第一个剪枝是如果当前的答案已经大于了我们已知的最小答案,不用说直接return返回即可. 第二个剪枝是我们可以将小猫的体重从大到小排序,这样 ...
- AcWing P164 可达性统计 题解
Analysis 这道题我一开始想到的是传递闭包,但是时间复杂度是n³,也开不下30000*30000的数组,所以我想到了拓扑+状态压缩(bitset),从后往前找,把能到达的点能到哪里用位运算赋到上 ...
- AcWing P378 骑士放置 题解
Analysis 这道题跟前几道题差不多,依旧是匈牙利算法求二分图匹配,在连边的时候,要连两个矛盾的位置(即一个骑士和其控制的位置).然后就跑一遍匈牙利算法就好了. #include<iostr ...
随机推荐
- gdocrimg04从库无法重启问题
1.查看error.logVersion: '5.6.25-log' socket: '/tmp/mysqld.3324_gdocrimg04.sock' port: 3324 Source d ...
- 【IDEA使用技巧】(4) —— IDEA 构建Java Maven项目、导入Eclipse项目、多Module Maven项目
1.IntelliJ IDEA构建Java Maven项目 1.1. IDEA构建Java Maven项目 ①选择Create New Project,选择创建Maven项目,并勾选Create fr ...
- redis复制机制
摘自redis设计与实现 通过客户端,发送slave of xxx给redis从服务器,即可实现主从服务器之间的复制.如果主服务器设置了requirepass进行身份验证,从服务器需要设置master ...
- centos7 设置静态ip , 并开机联网
修改 /etc/sysconfig/network-scripts 下的文件 我的是ens32 (不同系统这个文件名字不一样) 内容如下 TYPE=Ethernet PROXY_METHOD=none ...
- quartz2.3.0(十二)通过RMI协议向Scheduler调度器远程添加job任务
此代码示例通过RMI协议向Scheduler调度器远程添加job任务. 代码文件包括:job任务类(SimpleJob.java).RMI服务端server类(RemoteServerExample. ...
- CCF 2016-12-1 工资计算
CCF 2016-12-1 工资计算 题目 问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交 ...
- Python之TensorFlow的变量收集、自定义命令参数、矩阵运算、梯度下降-4
一.TensorFlow为什么要存在变量收集的过程,主要目的就是把训练过程中的数据,比如loss.权重.偏置等数据通过图形展示的方式呈现在开发者的眼前. 自定义参数:自定义参数,主要是通过Python ...
- .net core使用ocelot---第五篇 服务质量
简介 .net core使用ocelot---第一篇 简单使用 .net core使用ocelot---第二篇 身份验证使用 .net core使用ocelot---第三篇 日志记录 .net c ...
- webapp之登录页面当input获得焦点时,顶部版权文本被顶上去 的解决方法
如上图,顶部版权是用绝对定位写的,被顶上去了,解决方法是判断屏幕大小,改变footer的定位方式: <script> var oHeight = $(document).height(); ...
- Angular配置路由以及动态路由取值传值跳转
Angular配置路由 1.找到 app-routing.module.ts 配置路由 引入组件 import { HomeComponent } from './home/home.componen ...