奶牛的锻炼
2013-12-19 13:18
239 查看
奶牛的锻炼
Time Limit: 1000ms Memory Limit: 131072KBUSACO
奶牛Bessie有N分钟时间跑步,每分钟她可以跑步或者休息。若她在第i分钟跑步,可以跑出D_i米,同时疲倦程度增加1(初始为0)。若她在第i分钟休息,则疲倦程度减少1。无论何时,疲倦程度都不能超过M。另外,一旦她开始休息,只有当疲惫程度减为0时才能重新开始跑步。在第N分钟后,她的疲倦程度必须为0。
第一行,两个整数,代表N和M。
接下来N行,每行一个整数,代表D_i。
Bessie想知道,她最多能跑的距离。
输入数据
5 2 5 3 4 2 10
输出数据
9
N <= 2000 , M <= 500 , D_i <= 1000
思路:动态规划题,
用dp[i][j] 表示奶牛第i秒疲劳值为j时所能跑的最长路程, length[]
存储输入数据, 主要是dp[i][0]计算时较为复杂(转移方程较多), 要考虑原值,
(1~m)分前开始休息到i秒疲劳值刚好为0, 还有就是从(1~m)分前疲劳值为0就开始
休息(根本没跑)。最后dp
[0]就是所求答案。
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MIN -9999999 int dp[2001][501], length[2001]; int mymax(int a, int b, int c) //返回三个数中最大的 { if(a >= b && a >= c) { return a; } else if(b >= a && b >= c) { return b; } else if(c >= a && c >= b) { return c; } return -1; } int main() { int n, m, i, j, k, tmax; while(scanf("%d%d", &n, &m) != EOF) { for(i = 1; i <= n; i++) { scanf("%d", &length[i]); //接收数据 dp[0][i] = MIN; } dp[0][0] = 0; for(i = 1; i <= n; i++) { tmax = dp[i][0]; //为tmax设置一个临时最小值 for(k = 1; k <= m && i - k >= 0; k++) //k需要遍历1~m { tmax = mymax(tmax, dp[i-k][0], dp[i-k][k]); //dp[i][0] 有三个动态转移方程,由第i-k分疲劳值为0(没动)和第i-k分疲劳值为k休息, 还有dp[i][0]原值 } dp[i][0] = tmax; //找最大的即为答案 for(j = 1; j <= m; j++) { dp[i][j] = dp[i-1][j-1] + length[i]; //dp[i][j]转移方程只有这一个(上一分钟增加疲劳值得来) } } printf("%d\n", dp [0]); } return 0; }
相关文章推荐
- 奶牛的锻炼
- 奶牛的锻炼
- |Tyvj|动态规划|1023 奶牛的锻炼
- C语言奶牛的锻炼
- TYVJ 1023 奶牛的锻炼
- tyvj 1023 奶牛的锻炼
- tyvj1023 - 奶牛的锻炼 ——DP
- [线性DP]奶牛的锻炼
- 奶牛的锻炼
- Tyvj 1023 奶牛的锻炼 dp
- DP练习 - 奶牛的锻炼
- Tyvj 题目1023 奶牛的锻炼(DP)
- QUSTOJ1782 A奶牛的锻炼(线性动归)
- 奶牛锻炼
- 奶牛的锻炼-线性dp
- USACO //P1023 奶牛的锻炼
- Codevs 2161 奶牛的锻炼
- TYVJ P1023奶牛的锻炼(动态规划)
- HUT-1685 奶牛的锻炼 DP
- tyvj p1023(奶牛的锻炼)(100)