题目大意:3个迷你火车头拉人,看一次最多能拉多少人。题目要求输入车厢数,每节车厢的人数,以及每个迷你火车头能拉动车箱的数目,要求输出三个迷你火车头能拉动的最多人数。
解题思路:确实没看出来是背包的题,其实3个火车头就是你能取的次数,3次,每次都能取连续的m个
然后状态量就是 dp[i][j]前i个车厢,用j个火车头来拉,最多能拉多少人。
输出解为d[n][3]
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=50000+10;
int dp[maxn][4],a[maxn],t,m,n;
int main()
{
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d",&n);
int x;
a[0]=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&x);
a[i]=a[i-1]+x;
}
scanf("%d",&m);
int k;
for(int i=1; i<=n; i++)
for(int j=1; j<4; j++)
{
k=i-m;
if(k<0) k=0;
dp[i][j]=max(dp[i-1][j],dp[i-m][j-1]+a[i]-a[k]);
}
printf("%d\n",dp[n][3]);
}
}