POJ1976

题目链接如下:

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 
#include 
#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<

 

你可能感兴趣的:(dp专题)