Input
* Line 1: Two space-separated integers: N and M * Lines 2..N+1: Line i+1 contains the single integer: DiOutput
* Line 1: A single integer representing the largest distance Bessie can run while satisfying the conditions.Sample Input
5 2 5 3 4 2 10Sample Output
9对于这题,有两类,共三种状态,分别为:第一类第一种,“疲劳值未满,继续奔跑”;第二类第一种,“从某时刻开始的休息结束了”;第二类第二种,“尽管之前已经休息了,但还是继续休息”。
I.1: II.1: II.2: dp[i][j]=dp[i−1][j−1]+sample[i]dp[i][0]=dp[i−k][k]dp[i][0]=dp[i−1][0] 其中, dp[i][j] 表示在第 i 分钟,疲劳值为 j 的情况下马所奔跑的最长路程; sample[i] 表示在第 i 分钟内马所能奔跑的路程。 只需要按照上述方程递推到 i=n 即可得到答案。 #include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <cstring> #include <queue> using namespace std; int sample[10006], dp[10005][503]; int main(){ #ifdef TEST freopen("test.txt", "r", stdin); #endif // TEST int n, m; while(cin >> n >> m){ memset(dp, 0, sizeof(dp)); for(int i = 1; i <= n; i++) scanf("%d", &sample[i]); for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ dp[i][j] = dp[i-1][j-1] + sample[i]; } dp[i][0] = dp[i-1][0]; for(int k = 1; k < i && k <= m; k++)//注意k<=m的条件。如不加以限制会超时。 dp[i][0] = max(dp[i][0], dp[i-k][k]); } cout << dp[n][0] << endl; } return 0; }