链接:http://codeforces.com/problemset/problem/467/C
题意:给n个数,找出k段长度为m的不相交的区间,使这些区间的和最大。
思路:dp。。dp[i][j]表示i个数里有j段时最大值是多少。dp[i][j] = max(dp[i-1][j],dp[i-m][j-1]+nn[i]-nn[i-m]);
第i位有两种情况,一种是作为第j段的结尾,另一种是不选
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
const int maxn = 5010;
int n,m,k;
ll nn[maxn];
ll dp[maxn][maxn];
int main(){
while(~scanf("%d%d%d",&n,&m,&k)){
for(int i=1;i<=n;i++){
scanf("%I64d",&nn[i]);
nn[i]+=nn[i-1];
}
memset(dp,0,sizeof(dp));
for(int i = m;i<=n;i++)
for(int j = 1;j<=k;j++)
dp[i][j] = max(dp[i-1][j],dp[i-m][j-1]+nn[i]-nn[i-m]);
cout<<dp[n][k]<<endl;
}
return 0;
}