剪开黑夜

In the twilight of every early morning

导航

USACO 2008 Running(贝茜的晨练)

Posted on 2018-12-19 11:40  剪开黑夜  阅读(192)  评论(1编辑  收藏  举报

【题解】

        动态规划,dp[i][j]表示第i分钟疲劳度为j的最长距离。

【代码】

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 #define scan(x) cin >> x
 7 #define print(x) printf("%d\n", x)
 8 #define maxn 10005
 9 #define maxm 505
10 
11 int D[maxn], dp[maxn][maxm];
12 
13 int main()
14 {
15     int N, M;
16     scan(N);
17     scan(M);
18     for (int i = 1; i <= N; i++) scan(D[i]);
19     for (int i = 1; i <= N; i++) {
20         dp[i][0] = dp[i - 1][0];
21         for (int j = 1; j <= i && j <= M; j++) {
22             dp[i][0] = max(dp[i][0], dp[i - j][j]); // If spent the preceding j minutes resting
23             dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + D[i]); // Run when fatigue degree is j.
24         }
25     }
26     print(dp[N][0]);
27     //system("pause");
28     return 0;
29 }