题目链接:http://codeforces.com/problemset/problem/467/C;
题目大意:给一个序列,让求k个长度为m的的子序列的最大值;
/*
dp[i][j]表示前i个选j个子序列的最大值
转移方程:dp[i][j]=max(dp[i-1][j],dp[i-m][j-1]+tmp)
表示当前tmp选或不选
(tmp为最右下标为i的子序列和)
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int N=5005;
const ll mod=1e9+7;
ll dp[N][N];
ll sum[N];
ll a[N];
int main()
{
int n,m,k;
scanf("%d %d %d",&n,&m,&k);
for(int i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
ll ans=0;
for(int i=m; i<=n; i++)
{
ll tmp=sum[i]-sum[i-m];
for(int j=1; j<=min(k,i/m); j++)
{
dp[i][j]=max(dp[i-1][j],dp[i-m][j-1]+tmp);
// printf("%lld ",dp[i][j]);
}
// printf("\n");
}
printf("%lld\n",dp[n][k]);
return 0;
}