这是一道01背包的题目,每个车厢只能被选择一次。dp[i][j]表示用i个火车头拉动j个火车仓的人数和的最大值。
状态转移方程为:dp[i][j]=max(dp[i-1][j-m]+data[j]+data[j+1]+......+data[j-m+1],dp[i][k]);
怎样理解呢?这data[j]的人拉或不拉,有两种情况。
如果拉的话,用i个火车头拉j个火车仓的人数和就 = 用i-1个火车头拉j-m个火车仓 + 从j开始的k个仓的人数和
如果不拉的话,就继续拉下面的火车仓。
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int main()
{
int t,n,m,i,j,k,v,sum;
int data[50100],dp[4][50100];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(data,0,sizeof(data));
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
scanf("%d",&data[i]);
scanf("%d",&m);
for(i=1;i<=3;i++)
{
for(j=m;j<=n;j++)
{
s