这是找的倒数第二简单的,然而依旧不会,泪~ 昨天晚上调出来发现是(以示例为例)从倒数第二个平台直接跳下去 时间是0;从上面第一个跳下去 时间依旧是0  orz  12点半躺床上顿悟应该每个平台的时间不仅是一个,有左右两个时间 (唯一值得欣慰是发现了:dp值里面不用加上高度下落的时间差,最后dp[]+下落的高度,总共加一次就好,毕竟下落一定需要时间,又不能往上跳,那么总的下落时间是一定的,只需要考虑左右走的时间即可)

今天早上又纠结了一上午:对于一个平台,当然要么向左走,跳下去;要么向右走,跳下去。但是对于下面的平台,可能由上不止一个平台掉下来,那么位置就不同导致数值不同。凌乱ing ㄟ( ▔, ▔ )ㄏ 自己也有想到某平台上的某点到达左右边界的时间可以递归求出,无疑题解中的算法更好:dp数组只表示此平台的“左右端点”下落到地面的时间,很好的解决了上述问题


最后一合计 8+13>2+17 所以输出23

/*******
poj1661
2015.12.18
172K	0MS	C++	1625B
*******/
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 1000000
struct Platform
{
    int lx,rx,h;
}p[1010];    // 注意数组大小,要不会WA
int leftmin[1010];
int rightmin[1010];
int n,MAX;
bool cmp(Platform a,Platform b)
{
    return a.h>b.h;
}
int mintime(int L,int flag)
{
    int y = p[L].h;
    int i,x,ltime,rtime;
    if( flag )
        x = p[L].lx;
    else
        x = p[L].rx;
    for(i=L+1; i<=n; i++)
    {
        if( p[i].lx<=x && p[i].rx>=x)
            break;
    }
    if( i<=n )
    {
        if( y - p[i].h > MAX )
            return INF;
    }
    else
    {
        if( y > MAX )
            return INF;
        else
            return y;//没有板子
    }
    ltime = y - p[i].h + x - p[i].lx;
    rtime = y - p[i].h - x + p[i].rx;
    if( leftmin[i] == -1 )
        leftmin[i] = mintime(i,1);
    if( rightmin[i] == -1 )
        rightmin[i] = mintime(i,0);
    ltime += leftmin[i];
    rtime += rightmin[i];
    if( ltime < rtime ) //判断左边时间和右边时间
    {
        return ltime;
    }
    else
    {
        return rtime;
    }
}
int main()
{
    freopen("cin.txt","r",stdin);
    int i,ncases,x,y;
    scanf("%d",&ncases);
    while(ncases--)
    {
        scanf("%d %d %d %d",&n,&x,&y,&MAX);
        memset(leftmin,-1,sizeof(leftmin));
        memset(rightmin,-1,sizeof(rightmin));
        p[0].lx = x;
        p[0].rx = x;
        p[0].h = y;
        for(i=1; i<=n; i++)
            scanf("%d%d%d",&p[i].lx,&p[i].rx,&p[i].h);
        sort(p+1,p+1+n,cmp);  //快排,按板子高度从高到低排
        printf("%d\n",mintime(0,1));
        for(int i=0;i<=n;i++)
        printf("i=%d   left=%d  right=%d\n",i,leftmin[i],rightmin[i]);
    }
    return 0;
}