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
*/

浙公网安备 33010602011771号