分析:给n个数,求连续3段和的最大值。
这个题目的思考方式很像背包问题。
dp[i][j]表示前i个数字,放在j段的最大值。
如果选了第i个数,则有 dp[i-1][j] 如果不选第i个数,由于题目是要连续的,
则有dp[i-m][j-1]+sum[i]-sum[i-m] ,这里i-m是要保证连续。
dp[i][j]=max{ dp[i-1][j] ,dp[i-m][j-1]+sum[i]-sum[i-m] }
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int T,n,m,sum[50010],num[50010],dp[50010][5];
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
memset(sum,0,sizeof(sum));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
sum[i]=sum[i-1]+num[i];
}
scanf("%d",&m);
for(int i=m;i<=n;i++)
for(int j=1;j<=3;j++)
dp[i][j]=max(dp[i-1][j],dp[i-m][j-1]+sum[i]-sum[i-m]);
printf("%d
",dp[n][3]);
}
return 0;
}