G - Max Sum Plus Plus 线性dp
#include <bits/stdc++.h>
#define id first
#define val second
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
ll dp[maxn],a[maxn],pre[maxn];
//dp[i][j]表示前面i个数,分成j组的最大和,第i个数一定在数组中
//所以最后这个dp[j] 表示的是一定包括遍历到当前位置i的最大和
//pre[j] 表示一定不包括当前位置i的最大和
//所以最后pre[m]和dp[m] 要取一个最大值,因为dp[m]是一定包括a[n]的,而pre[m]是一定不包括a[n]的
int main(){
int m,n;
while(~scanf("%d%d",&m,&n)){
for(int j=0;j<=n;j++) dp[j]=-inf64,pre[j]=-inf64;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
pre[0]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=min(i,m);j++){
pre[j]=max(pre[j],dp[j]);
dp[j]=max(pre[j-1],dp[j])+a[i];
}
}
printf("%lld
",max(pre[m],dp[m]));
}
return 0;
}