深夜失眠。。。起来看了知乎上一篇关于失眠的问答
觉得说的很好,在这里分享一下晚上常失眠?
反正也睡不着,遂起来刷题乎~~~
这个题要求还蛮纠结的,叙述起来比较麻烦,自己看吧
我们用dp[i][j]表示在第i分钟疲劳度为j所对应的最大距离
则dp[i][j] = min(dp[i-1][j-1]+a[i], dp[i][j])
另外疲劳度每次必须降到0之后才能再次起跑
所以dp[i][0] = min(dp[i][0], dp[i-k][k])
话说深夜两点半居然还有别人的也在交题。。。也是蛮拼的
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAXN 10010
using namespace std;
int a[MAXN];
int dp[MAXN][510];
int main(void) {
int m, n;
while(~scanf("%d%d", &n, &m)) {
for(int i=1; i<=n; ++i)
scanf("%d", &a[i]);
memset(dp, 0, sizeof(dp));
//dp[i][j]表示第i分钟疲劳度为j所跑的最大距离
int ans = 0;
for(int i=1; i<=n; ++i) {
for(int k=1; k<i&&k<=m; ++k) {
dp[i][0] = max(dp[i-1][0], dp[i][0]);
dp[i][0] = max(dp[i-k][k], dp[i][0]);
}
for(int j=1; j<=m; ++j) {
dp[i][j] = max(dp[i][j], dp[i-1][j-1]+a[i]);
//printf("dp[%d][%d] = %d\n", i, j, dp[i][j]);
}
ans = max(ans, dp[i][0]);
}
printf("%d\n", ans);
}
return 0;
}