思路:dp[i][j]表示到i位置时找出j组所得的最大值。
# include <stdio.h>
# include <string.h>
# include <algorithm>
using namespace std;
long long a[5001]={0}, dp[5001][5001];
int main()
{
int n, m, k;
while(~scanf("%d%d%d",&n,&m,&k))
{
memset(dp, 0, sizeof(dp));
for(int i=1; i<=n; ++i)
{
scanf("%d",&a[i]);
a[i] += a[i-1];
}
for(int i=1; i<=k; ++i)
for(int j=i*m; j<=n; ++j)
dp[j][i] = max(dp[j-1][i], dp[j-m][i-1] + a[j] - a[j-m]);
printf("%I64d\n",dp[n][k]);
}
return 0;
}