POJ 1661

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;


const int maxn=1010;

int t,n,s1,s2,maxs;

typedef struct name
{
     int x1,x2,h;
}jimmy;

jimmy a[maxn];

int dp[maxn][2];

const int INF=9999999;


bool cmp(jimmy a,jimmy b)
{
    if(a.h<b.h)
        return true;
    return false;
}


int leftmin(int i)
{
    int k=i-1;
    while(k>0&&a[i].h-a[k].h<=maxs)
    {
        if(a[i].x1>=a[k].x1&&a[i].x1<=a[k].x2)
        {
          dp[i][0]=a[i].h-a[k].h+min(a[i].x1-a[k].x1+dp[k][0],a[k].x2-a[i].x1+dp[k][1]);
          return 0;
        }
        else
            k--;
    }
    if(a[i].h-a[k].h>maxs)
        dp[i][0]=INF;
     else
        dp[i][0]=a[i].h;
}


int rightmin(int i)
{
    int k=i-1;
    while(k>0&&a[i].h-a[k].h<=maxs)
    {
        if(a[i].x2>=a[k].x1&&a[i].x2<=a[k].x2)
        {
            dp[i][1]=a[i].h-a[k].h+min(a[i].x2-a[k].x1+dp[k][0],a[k].x2-a[i].x2+dp[k][1]);
            return 0;
        }
        else
            k--;
    }
    if(a[i].h-a[k].h>maxs)
        dp[i][1]=INF;
    else
        dp[i][1]=a[i].h;
}


int shorttime()
{
    int i;
    for(int i=1;i<=n+1;i++)
    {
        leftmin(i);
        rightmin(i);
    }
    return min(dp[n+1][0],dp[n+1][1]);
}


int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d%d",&n,&s1,&s2,&maxs);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&a[i].x1,&a[i].x2,&a[i].h);
        }
        a[0].x1=-20000;
        a[0].x2=20000;
        a[0].h=0;
        a[n+1].x1=s1;
        a[n+1].x2=s1;
        a[n+1].h=s2;
        sort(a,a+n+2,cmp);
        /*for(int i=0;i<=n+1;i++)
            printf("%d  %d  %d\n",a[i].x1,a[i].x2,a[i].h);*/
        printf("%d\n",shorttime());
    }
    return 0;
}

这个题目还是一个记忆化搜索,对现在的我来说还是感觉比较难啊,虽然一开始想到了应该是这种问题,但是如何设立dp数组没有想到能那么精妙,这就是也个难点了啊,
让人很是苦恼的啊,然后难点就是循环i:1-n+1然后求解每层的i的对向左还是向右走的选择的算的的dp的值了。这些也需要一定的技巧特别是对底层的处理。然后看别人的
解题报告还是能学到不少的,我是从这个博客里学的  http://blog.csdn.net/jdplus/article/details/19919531     然后就是学习了一哈那个qsort的用法,网上学习资料
很多,随便找了一篇这个的,http://blog.csdn.net/ncs12/article/details/24139189   发现这个qsort的用法和sort的用法还是有很多不一样的,那个当 > < =  三者的
情况下的对排序结果的处理都是不同的,这点倒是qsort的好处啊。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值