题目链接:https://vjudge.net/contest/325203#problem/B
翻译:
三个火车头,能拉的最大车厢数相同。每一个火车头拉的只能是连续的车厢。给定一个数n,表示有n节车厢,接下来是每个车厢的人数。求能拉的最大人数。
分析:
拉的车厢只能是连续的,面对一个车厢,可拉可不拉。dp[i][j]表示前i节车厢,用j个火车头拉,所能拉的最大人数。对车厢人数用前缀和处理,维护dp[i][j]的最大值即可。
完整代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define NN 50001
int n,num[NN];
int dp[NN][5];/*dp[i][j]:前i个车厢,用j个火车头拉,所能拉的最大人数*/
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(num,0,sizeof(num));
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&num[i]);
num[i]+=num[i-1];/*前缀和*/
}
int mx;
scanf("%d",&mx);
for(int i=mx; i<=n; i++)
{
for(int j=1; j<=3; j++)
dp[i][j]=max(dp[i-1][j],dp[i-mx][j-1]+num[i]-num[i-mx]);
}
printf("%d\n",dp[n][3]);
}
return 0;
}