【洛谷 SP283】NAPTIME - Naptime(DP)
先考虑如果只有一天,那么该怎么做。
设\(f[i][j][1]\)表示前\(i\)个小时睡了\(j\)个小时并且第\(j\)个小时正在睡觉时的最大体力,\(f[i][j][1]\)表示前\(i\)个小时睡了\(j\)个小时并且第\(j\)个小时没在睡觉时的最大体力。
则有
\]
\]
边界条件:\(f[1][0][0]=f[1][1][1]=0\)
答案:\(max(f[n][b][0],f[n][b][1])\)
然后,现在两天是连着的,唯一的区别就是第一个小时可以睡着。
于是,令\(f[1][1][1]=U_1\),然后再跑一遍DP,把\(ans\)和\(f[n][b][1]\)取最大值就行了。
为什么只与\(f[n][b][1]\)取最大值呢?
因为这里把\(f[1][1][1]\)赋值为了\(U_1\),那么我们默认就是第一个小时进入了熟睡状态,所以上一天最后一个小时必须开始睡觉才行。
因为SPOJ的空间限制比较大,我就没用滚动数组了。
#include <cstdio>
inline int max(int a, int b){
return a > b ? a : b;
}
inline int min(int a, int b){
return a < b ? a : b;
}
const int MAXN = 4000;
int f[MAXN][MAXN][3], w[MAXN];
int n, m, T;
int main(){
scanf("%d", &T);
while(T--){
int ans = 0;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i)
scanf("%d", &w[i]);
f[1][0][0] = f[1][1][1] = 0;
for(int i = 2; i <= n; ++i){
for(int j = 1; j <= min(i, m); ++j){
f[i][j][0] = max(f[i - 1][j][0], f[i - 1][j][1]);
if(j != 1) f[i][j][1] = max(f[i - 1][j - 1][0], f[i - 1][j - 1][1] + w[i]); //第一个小时不加体力
}
}
f[1][1][1] = w[1]; f[1][0][0] = 0; //边界
ans = max(f[n][m][1], f[n][m][0]);
for(int i = 2; i <= n; ++i)
for(int j = 1; j <= min(i, m); ++j){
f[i][j][0] = max(f[i - 1][j][0], f[i - 1][j][1]);
if(j != 1) f[i][j][1] = max(f[i - 1][j - 1][0], f[i - 1][j - 1][1] + w[i]);
}
ans = max(ans, f[n][m][1]);
printf("%d\n", ans);
}
return 0;
}
【洛谷 SP283】NAPTIME - Naptime(DP)的更多相关文章
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
原文链接https://www.cnblogs.com/zhouzhendong/p/9261079.html 题目传送门 - 洛谷P3959 题目传送门 - Vijos P2032 题意 给定一个 ...
- 洛谷P1244 青蛙过河 DP/思路
又是一道奇奇怪怪的DP(其实是思路题). 原文戳>>https://www.luogu.org/problem/show?pid=1244<< 这题的意思给的挺模糊,需要一定的 ...
- 洛谷P3928 Sequence2(dp,线段树)
题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...
- 洛谷P1140 相似基因 (DP)
洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...
- 洛谷P2224 [HNOI2001] 产品加工 [DP补完计划,背包]
题目传送门 产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时 ...
- 洛谷1417 烹调方案 dp 贪心
洛谷 1417 dp 传送门 挺有趣的一道dp题目,看上去接近于0/1背包,但是考虑到取每个点时间不同会对最后结果产生影响,因此需要进行预处理 对于物品x和物品y,当时间为p时,先加x后加y的收益为 ...
- 洛谷1387 二维dp 不是特别简略的题解 智商题
洛谷1387 dp题目,刚开始写的时候使用了前缀和加搜索,复杂度大概在O(n ^ 3)级别,感觉这么写还是比较对得起普及/提高-的难度的..后来看了题解区各位大神的题解,开始一脸mb,之后备受启发. ...
- 洛谷 P2657 (数位DP)
### 洛谷 P2657 题目链接 ### 题目大意:给你一个数的范围 [A,B] ,问你这段区间内,有几个数满足如下条件: 1.两个相邻数位上的数的差值至少为 2 . 2.不包含前导零. 很简单的数 ...
随机推荐
- 使用USB Key(加密狗)实现身份认证
首先你需要去买一个加密狗设备,加密狗是外形酷似U盘的一种硬件设备! 这里我使用的坚石诚信公司的ET99产品 公司项目需要实现一个功能,就是客户使用加密狗登录, 客户不想输入任何密码之类的东西,只需要插 ...
- 牛客网暑期ACM多校训练营(第七场):J-Sudoku Subrectangles
链接:J-Sudoku Subrectangles 题意:给出 n * m 的字母矩阵,公52种字母.求出不含重复元素的子矩阵的个数. 题解: L[i][j]:s[i][j] ~ s[i][ j - ...
- 机器学习 (三) 逻辑回归 Logistic Regression
文章内容均来自斯坦福大学的Andrew Ng教授讲解的Machine Learning课程,本文是针对该课程的个人学习笔记,如有疏漏,请以原课程所讲述内容为准.感谢博主Rachel Zhang 的个人 ...
- django之上传文件和图片
文件上传:文件上传功能是网站开发中必定会使用到的技术,在django项目中也是如此,下面会详细讲述django中上传文件的前端和后端的具体处理步骤: 前端HTML代码实现: 1.在前端中,我们需要填入 ...
- MySQL 5.6查看数据库的大小
1. use information_schema; 2. select concat(round(sum(data_length/1024/1024),2),'MB') as data from t ...
- HBase 高可用性
1.Replication 之 Master <--> Master 互备 Master1 (所用zookeeper所处节点 hadoop[01-05] ): -- add_peer '1 ...
- 【iOS开发】initWithNibName、initWithCoder、awakeFromNib和 loadNibNamed详解
第一.initWithNibName这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的. 第二.initWithCoder 是一个类在IB中创建但 ...
- DPDK 网卡RSS(receive side scaling)简介
网卡RSS(receive side scaling)简介 RSS是一种网卡驱动技术,能让多核系统中跨多个处理器的网络收包处理能力高效能分配.注意:由于同一个核的处理器超线程共享同一个执行引擎,这个效 ...
- Mybatis学习系列(四)Mapper接口动态代理
实现原理及规范 Mapper接口动态代理的方式需要手动编写Mapper接口,Mybatis框架将根据接口定义创建接口的动态代理对象,代理对象的方法体实现Mapper接口中定义的方法. 使用Mapper ...
- Leader Election
Leader Election Zookeeper的基本操作 Zookeeper虽然是分布式系统,但它并不是为文件存储而设计的,Zookeeper里存储的一般是配置信息和源信息.实际上,Zookeep ...