动态规划特训:帮助jimmy(POJ1661)递推解法

上一篇文章中已经介绍了该题的递归解法。这里换一种思维使用递推的方式求解,其实方法差不多,设置两个dp数组按照上面的方式递推求解即可,稍微转换一下思路而已。这里直接给出代码。

#include<stdio.h>
#include<algorithm>
#include<string.h>
#define inf 123123123
using namespace std;
struct pingtai
{
	int x;
	int y;
	int h;
	bool operator <(const pingtai &A)
	{
		return h<A.h;
	}
}dp[1001];
int n,max1;
int mintime[1001][2];
int min(int a,int b)
{
	return a>b?b:a;
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int x,h;
		scanf("%d%d%d%d",&n,&x,&h,&max1);
		dp[n+1].x=dp[n+1].y=x;
		dp[n+1].h=h;
		memset(mintime,-1,sizeof(mintime));
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d%d",&dp[i].x,&dp[i].y,&dp[i].h);
		}
		sort(dp+1,dp+n+1);
		if(dp[1].h>max1)                      //记得要先赋值初始条件 
		{
			mintime[1][0]=mintime[1][1]=inf;
		}
		else
		{
			mintime[1][0]=mintime[1][1]=dp[1].h;
		}
		for(int i=2;i<=n+1;i++)
		{
			for(int j=0;j<=1;j++)
			{
				int Lx;
				if(j==0)
				{
					Lx=dp[i].x;
				}
				else
				{
					Lx=dp[i].y;
				}
				int  k;
				for(k=i-1;k>=0;k--)
				{
					if(dp[k].x<=Lx&&dp[k].y>=Lx)
					{
						break;
					}
				}
				if(k>=0)
				{
					if(dp[i].h-dp[k].h>max1)
					{
					mintime[i][j]=inf;
					continue;
				    }
				}
				else
				{
					if(dp[i].h>max1)
					{
					mintime[i][j]=inf;
					continue;
				    }
					else
					{
						mintime[i][j]=dp[i].h;
						continue;
					}
				}
				int tmp1=dp[i].h-dp[k].h+Lx-dp[k].x+mintime[k][0];
				int tmp2=dp[i].h-dp[k].h+dp[k].y-Lx+mintime[k][1];
				mintime[i][j]=min(tmp1,tmp2);
			}
		}
		printf("%d\n",mintime[n+1][1]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/mavises/article/details/81428637
今日推荐