Max Sum Plus Plus ( m子段和最大值 )
作者:
hh666
,
2022-06-28 09:46:07
,
所有人可见
,
阅读 127
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1000010;
int f[2][N];
int g[2][N];
int sum[N];
/*
f[i][k]:前k个数分为i段,第k个数必须选;1:第k个数单独为1段;2:第k个数与前面的数连一块。
f[i][k]=max(g[i-1][k-1],f[i][k-1])+a[k];
g[i][k]:前k个数分为i段,第k个数可选可不选;1:选第k个数,2:不选第k个数。
g[i][k]=max(g[i][k-1],f[i][k])
*/
int main(){
int n,m;
while(~scanf("%d%d",&m,&n)){
for(int i = 1; i <= n; i ++ ){
scanf("%d",&sum[i]);
sum[i] += sum[i-1];
}
memset(f,0,sizeof f);
memset(g,0,sizeof g);
for(int i = 1; i <= m; i ++ ){
for(int k = i; k <= n; k ++ ){
//从k个数中取k段的最大值是前k个数的和
if(k == i) f[i &1 ][k] = g[i&1][k] = sum[k];
else{
f[i&1][k] = max(f[i&1][k-1], g[i-1&1][k-1]) + sum[k] - sum[k-1];
g[i&1][k] = max(g[i&1][k-1], f[i&1][k]);
}
}
}
printf("%d\n",g[m&1][n]);
}
return 0;
}