思路: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;
}
解决一个程序员面临的挑战:从给定的整数序列中找出k个不重叠且长度为m的连续区间,使得这些区间的元素之和达到最大值。通过动态规划的方法实现了这一目标。
is
maximal possible. Help George to cope with the task.
493

被折叠的 条评论
为什么被折叠?



