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. SQL——IN操作符

    一.IN操作符基本用法 IN操作符用于在WHERE字句中规定多个值. 语法格式如下: SELECT 列名1,列名2... FROM 表名 WHERE 列名 IN(值1,值2...); 示例studen ...

  2. python大数据挖掘和分析的套路

    大数据的4V特点: Volume(大量):数据巨大. Velocity(高速):数据产生快,每一天每一秒全球人产生的数据足够庞大且数据处理也逐渐变快. Variety(多样):数据格式多样化,如音频数 ...

  3. Tensorflow基本概念笔记

    一.TensorFlow使用简单,部署快捷 TensorFlow使用数据流图(计算图)来规划计算流程,可以将计算映射到不同的硬件和操作平台.凭借着统一的架构,TensorFlow可以方便的部署剑各种平 ...

  4. tsql获取sqlserver某个库下所有表

    ) declare my_cursor cursor for (select [name] from SysObjects where XType='U') open my_cursor fetch ...

  5. Python之TensorFlow的卷积神经网络-5

    一.卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度 ...

  6. vmware下的linux没有网络问题解决思路

    这里几天一直在搞vm下的linux主机的网络问题,这里做个总结 这里使用的NAT连接方式 1.首先保证本机联网正常 2.检查虚拟机相应的服务(VMware NET Service 和 VMware W ...

  7. Socket HttpListen

    HttpListener sSocket = new HttpListener(); sSocket.Prefixes.Add("http://127.0.0.1:8080/"); ...

  8. Euraka适合初学者的简单小demo

    1. 创建父工程:父工程的的打包形式该为pom,删除其余无关的文件 修改父工程的pom文件内容如下: <?xml version="1.0" encoding="U ...

  9. php操作表格(写)

    一,转载:http://www.thinkphp.cn/extend/832.html 二,转载:http://m.blog.csdn.net/article/details?id=7827038

  10. ZK中使用JS读取客户端txt文件内容问题

    最近写一个需求时遇到一个问题,用户需要通过点击一个按钮直接读取他自己电脑上D盘的一个txt文件内容显示到页面,因为项目现在是用ZK写的.我对于ZK也是刚刚了解不就,很多都还不是很熟.起初我是想用io流 ...