A Mini Locomotive

A Mini Locomotive


https://vjudge.net/contest/476972#problem/I

f[i][j]     前i辆机车拉 前j辆客车的最大乘客数
m     一辆机车能拉的车数

for(j=m;j<=n;j++)
{
    for(i=1;i<=n-m+1;i++)
    {
        int sum=0;
        for(q=j-m+1;q<=j;q++)sum+=a[i];
        f[i][j]=max(f[i-1][j-m]+sum,f[i][j-m]);      
    }
}

结果出错,因为在   f[i][j]=max(f[i-1][j-m]+sum,f[i][j-m]);   中,还没考虑到f[i][j-m+1]..f[i][j-m+2]..等情况,即

前i辆机车拉前j辆客车=max(前i-1辆机车拉前j-m辆客车+后m辆客车,前i辆机车拉前(j-m至j-1)辆客车 )

所以在前面需要加上

for(int q=j-m+1;q<=j;q++)
      {
               if(q!=j)cmax=max(cmax,f[i][q]);
      }

#include<iostream>
#include<cstring>
using namespace std;
int a[50005],f[4][50005];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		memset(a,0,sizeof(a));
		memset(f,0,sizeof(f));
		int n,m;
		cin>>n;
		for(int i=1;i<=n;i++)
		cin>>a[i];
		cin>>m;
		for(int j=m;j<=n;j++)
		{
			for(int i=1;i<=3;i++)
			{
				int sum=0,cmax=0;
				for(int q=j-m+1;q<=j;q++)
				{
					sum+=a[q];                            //计算第j-m+1到第j辆客车的乘客总数
					if(q!=j)cmax=max(cmax,f[i][q]);       //找出前i辆机车在前j-m+1辆客车中所拉的乘客数 到 前j-1辆客车 的最大值
				}
				f[i][j]=max(f[i-1][j-m]+sum,cmax);
			}
		}
		cout<<f[3][n]<<endl;
	}
}


/*
1
7
35 40 50 10 30 45 60
2

240
*/

 

posted @ 2022-02-11 17:43  是橙橙吖  Views(26)  Comments(0)    收藏  举报