显然是DP
fi,j 表示前i个位置,分了j段的最大值
则有:
fi,j=Max{fi−1,j,fk,j−1}+ai
k其实不用枚举,直接带着刷最大值就好了
示例程序:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define cl(x,y) memset(x,y,sizeof(x))
#define LL long long
using namespace std;
const int maxn=5005;
int n,m,a[maxn];
LL f[maxn][2],ans;
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
cl(f,192);ans=f[0][0];
f[0][0]=0;
for (int j=1;j<=m;j++){
LL w=f[0][(j&1)^1];
for (int i=1;i<=n;i++)
f[i][j&1]=max(f[i-1][j&1],w)+a[i],
w=max(w,f[i][(j&1)^1]),ans=max(ans,f[i][j&1]);
}
printf("%lld",ans);
return 0;
}