题解:这道题一开始想复杂了....
题意即为在一个数列中,找到k个长度为m的串,使其和最大,且两个串不相交。
设d[i][j]为以i结尾,其后还能有j个长度为m的串此时和的最大值,那么d[i][j]=max(d[i-1][j],d[i-m][j+1]+sum[..]) (sum为i-m+1到i的和)
d[i-1][j]是不取第i个的情况,而d[i-m][j+1]+sum[..]为取第i个的情况。
答案为d[n][0]。
注意j要从k-1开始推。
#include <iostream>
#include <cstdio>
using namespace std;
int n,m,k,a[5005];
long long sum[5005],d[5005][5005];
int main()
{
scanf("%d%d%d",&n,&m,&k);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=1;i<=n;i++)
sum[i]=sum[i-1]+a[i];
for (int i=m;i<=n;i++)
for (int j=k-1;j>=0;j--)
d[i][j]=max(d[i-1][j],d[i-m][j+1]+sum[i]-sum[i-m]);
cout<<d[n][0]<<endl;
return 0;
}