hud 3905 - Sleeping [动态规划]
来源:互联网 发布:淘宝打折软件开发接口 编辑:程序博客网 时间:2024/05/16 06:11
题意:一节课有 n 分钟,如果在第 i 分钟听课就能得到 a[i] 分,如果睡觉就得不到这个分,规定一节课至少要睡 m 分钟,每次听课必须是连续的时间 >=L 分钟,睡觉的时间可以不连续,求能得到的最多的分数。
题解:
1. 看别人的规划思想是 dp[i][j][0] 表示前 i 分钟听课 j 分钟而且第 i 分钟没有听课,dp[i][j][1] 表示前 i 分钟听课 j 分钟而且第 i 分钟在听课。
2. 我的思想是 dp[i][j][0] 表示前 i 分钟睡觉了 j 分钟而且第 i 分钟没有睡觉,dp[i][j][1] 表示前 i 分钟睡觉了 j 分钟而且第 i 分钟在睡觉。则:
dp[i][j][1] = max(dp[i-1][j-1][0], dp[i-1][j-1][1]);
dp[i][j][0] = max(dp[i-L][j][1]+sum[i]-sum[i-L], dp[i-1][j][0]+a[i]);
#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 1005;int dp[MAXN][MAXN][2];int main(){ int n, m, L; int a[MAXN], sum[MAXN]; while (scanf("%d %d %d", &n, &m, &L) != EOF) { for (int i=1; i<=n; i++) scanf("%d", &a[i]); memset(sum, 0, sizeof(sum)); memset(dp, 0, sizeof(dp)); for (int i=1; i<=n; i++) sum[i] = sum[i-1] + a[i]; for (int i=1; i<=n; i++) { if (i >= L) dp[i][0][0] = sum[i]; // 前 i 分钟全部都不睡觉 for (int j=1; j<=m && j<=i; j++) { dp[i][j][1] = max(dp[i-1][j-1][0], dp[i-1][j-1][1]); if (i-L >= j) dp[i][j][0] = max(dp[i-L][j][1]+sum[i]-sum[i-L], dp[i-1][j][0]+a[i]); // 之前写的是: // dp[i][j][0] = max(dp[i-L][j][1], dp[i-L][j][0]) + sum[i] - sum[i-L]; // 是错误的. } } printf("%d\n", max(dp[n][m][0], dp[n][m][1])); }}
- hud 3905 - Sleeping [动态规划]
- 2577 HUD (动态规划)
- hud动态规划练习2
- HUD 5375 Gray code 动态规划
- hud 1467(动态规划。解题报告)
- hud上的动态规划练习
- hud 2546饭卡(动态规划)
- hdu 3905 Sleeping
- HDU 3905 Sleeping
- HDU 3905 Sleeping
- hdu 3905 sleeping
- HDU 3905 Sleeping ---dp
- hdu 3905 Sleeping
- HDU 3905 Sleeping dp
- HDU-3905 Sleeping
- Sleeping
- Sleeping
- HUD 1003/HDU 1081:动态规划之最大子序列和+最大矩阵和
- 八大排序算法总结
- Windows Installer Error Messages
- Usaco 1.4.4 母亲的牛奶(Mother's Milk)
- java多线程:死锁
- 博客、微博、社交网站的对比与未来发展浅析
- hud 3905 - Sleeping [动态规划]
- 也谈关于 Zend Studio-8.0.0中文汉化
- 如何防止Android应用被反编译
- C#中Access数据库 标准表达式中数据类型不匹配
- C# win form退出窗体时对话框实用
- JavaScript和Css浏览器兼容
- qsort()的compare函数示例
- 【GLSL教程】(七)逐像素的光照
- Java的int和String类型间互相转换