题目链接

先考虑如果只有一天,那么该怎么做。

设\(f[i][j][1]\)表示前\(i\)个小时睡了\(j\)个小时并且第\(j\)个小时正在睡觉时的最大体力,\(f[i][j][1]\)表示前\(i\)个小时睡了\(j\)个小时并且第\(j\)个小时没在睡觉时的最大体力。

则有

\[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])
\]

边界条件:\(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;
}

最新文章

  1. Android 四大组件 与 MVC 架构模式
  2. qt qml 刮刮卡效果
  3. Linux学习 : 自己写bootloader
  4. Mysql游标阻止执行最后一次
  5. java并发编程实践学习(2)--对象的组合
  6. UVALive 5888 Stack Machine Executor (栈+模拟)
  7. 性能更好的js动画实现方式——requestAnimationFrame
  8. unlocker208安装之后看不到Apple macos选项,解决办法.
  9. C语言获取系统当前时间转化成时间字符串
  10. ASP.NET 后台下载文件方法
  11. django中使用json.dumps处理数据时,在前台遇到字符转义的问题
  12. Ext JS学习第五天 Ext_window组件(一)
  13. 内核调试神器SystemTap — 更多功能与原理(三)
  14. MapReduce-TextInputFormat 切片机制
  15. CAN自收自发问题小结
  16. Openstack-Ceilometer-Alarm运行机制
  17. Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)
  18. 【转】Tomcat 快速入门
  19. elasticsearch搜索集群基础架构
  20. SaltStack error: No module named &#39;salt&#39;

热门文章

  1. Python 3基础教程20-Python中导入模块和包
  2. Uniy 组件式泛型单例模式
  3. 如何使用remix
  4. Drools 7.4.1.Final参考手册(六) 用户手册
  5. ACM做题随做随思
  6. Daily Scrum02 12.04
  7. Linux arm64的虚拟内存布局
  8. weak_ptr打破环状引用
  9. hash function比较
  10. 【SSH】——Struts2中的动态方法调用(一)