上一篇文章中已经介绍了该题的递归解法。这里换一种思维使用递推的方式求解,其实方法差不多,设置两个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;
}