【POJ 1661 Help Jimmy】 DP


POJ1661
POJ1661题目链接
题意就是一个小人在最高的平台上选择向左或者向右走,每秒的行走速度和下降速度都是1,有一个最长的下降的距离,超过这个距离就会GG,求最小时间
由于小人只能选择从左侧下降或者从右侧下降,我们只要设置两个下降状态,然后按照高度排序从下向上一下就可以了
设置 d p [ 0 ] [ i ] i
设置 d p [ 1 ] [ i ] i
然后从低到高进行更新就可以了。具体实现看代码。
POJ1661代码

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
typedef long long ll;
const int maxn = 1005;
const int INF = 0x3f3f3f3f;
struct data
{
    int l,r,h;
}x[maxn];
int dp[2][maxn];
bool cmp(const data &a,const data &b)
{
    if(a.h==b.h) return a.l<=b.l;
    return a.h<b.h;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,X,Y,maxx;
        scanf("%d%d%d%d",&n,&X,&Y,&maxx);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&x[i].l,&x[i].r,&x[i].h);
        }
        for(int i=0;i<=n+1;i++)
        {
            dp[0][i]=INF;
            dp[1][i]=INF;
        }
        sort(x+1,x+1+n,cmp);
        x[n+1].l=X;
        x[n+1].r=X;
        x[n+1].h=Y;
        for(int i=1;i<=n+1;i++)
        {
            for(int j=i-1;j>=1;j--)
            {
                if(x[i].h-x[j].h<=maxx&&x[i].h>x[j].h)
                {
                    if(x[j].l<=x[i].l&&x[i].l<=x[j].r)
                    {
                        dp[0][i]=min(dp[0][i],x[i].h-x[j].h+min(dp[0][j]+x[i].l-x[j].l,dp[1][j]+x[j].r-x[i].l));
                        break;
                    }
                }
            }
            if(dp[0][i]==INF)
            {
                if(x[i].h>maxx) dp[0][i]=INF;
                else dp[0][i]=x[i].h;
            }
            for(int j=i-1;j>=1;j--)
            {
                if(x[i].h-x[j].h<=maxx&&x[i].h>x[j].h)
                {
                    if(x[j].l<=x[i].r&&x[i].r<=x[j].r)
                    {
                        dp[1][i]=min(dp[1][i],x[i].h-x[j].h+min(dp[0][j]+x[i].r-x[j].l,dp[1][j]+x[j].r-x[i].r));
                        break;
                    }
                }
            }
            if(dp[1][i]==INF)
            {
                if(x[i].h>maxx) dp[1][i]=INF;
                else dp[1][i]=x[i].h;
            }
        }
        printf("%d\n",min(dp[0][n+1],dp[1][n+1]));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38891827/article/details/82226183