#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1000010;
int dp[maxn];
int num[maxn];
int premax[maxn];
int main() {
int n, m;
while (scanf("%d %d", &m, &n) != EOF) {
for (int i = 1; i <= n; i++) {
scanf("%d", &num[i]);
}
memset(dp, 0, sizeof(dp));
memset(premax, 0, sizeof(premax));
int tmp;
for (int i = 1; i <=m; i++) {
tmp = -1e9;
for (int j = i; j <= n; j++) {
dp[j] = max(premax[j - 1]+num[j], dp[j - 1]+num[j]);
premax[j-1] = tmp;
//为什么更新j-1,因为下一次循环j++后要用j,这里更新j会导致数据丢失
tmp = max(tmp, dp[j]);
}
}
printf("%d\n", tmp);
}
}
参考了下面这篇文章,文章思路都对,有一点笔误(对k的范围说明有点问题)和一处不清楚,不清楚的我在注释中说明了。
https://blog.51cto.com/u_13688928/2117013