题目链接如下:
http://poj.org/problem?id=1976
题意描述:一辆火车由N节车厢组成,每节车厢中所装的人数给定。现有三节迷你火车头,每节火车头所能拉动的最大车厢节数给定为m,问这三节迷你车厢所能拉动的最多人数:
解题思路:首先定义一个d[]数组,d[i]代表以第i节车厢结尾的m节车厢人数。ans[i][j]代表使用j个迷你火车头,只考虑前i节车厢所能拉动的最大人数。
于是有状态转移方程为:ans[i][j]=max(ans[i-1][j],ans[i-m][j-1]]+d[i])。
代码实现如下:
#include <iostream>
#include <string.h>
#define maxn 50005
using namespace std;
int num[maxn],d[maxn];
int ans[maxn][4];
int main()
{
int T;cin>>T;
while(T--)
{
int pc;cin>>pc;num[0]=0;
int sum=0;
for(int i=1;i<=pc;i++)
{
cin>>num[i];
}
int n;cin>>n;
for(int i=1;i<=pc;i++)
{
sum+=num[i];
if(i>=n)
{
sum-=num[i-n];
d[i]=sum;
}
}
memset(ans,0,sizeof(ans));
for(int i=n;i<=pc;i++)
{
for(int j=1;j<=3;j++)
{
ans[i][j]=max(ans[i-1][j],ans[i-n][j-1]+d[i]);//状态转移方程
}
}
cout<<ans[pc][3]<<'\n';
}
}
1418

被折叠的 条评论
为什么被折叠?



