poj 1661 Help Jimmy

DPDPDPDPDPDPDPDP。。。。

 

强大的DP。。。

 

搜的资料上有讲解这题的,一直没看懂,搜了好多人的代码,比较看来,还是资料上的好点。基本完全照抄了。中间还搬错的有,害我找了好长时间。。把那y改成x就OK了,崩溃!

 

怎么说呢,这种方法还凑合,会思考下这一步为什么这么做,因为DP还是不熟练,自己写的话写不出来。。。

 

这道题求时间最短,把这个问题分解为,左端到达低端时间最短时间,和右端到达低端最短时间,使用递归。

 

应该是这样滴,嗯。递归的最底层是地面和最低板的时间,算出这个最短时间然后算高一层到达最低板的时间。。。。。。表达能力真次啊。。。

 

把资料上的解释摘下来了:

 

n  此题目的子问题是什么呢?
n  Jimmy 跳到一块板上后,可以有两种选择,向左走或向右走。走到左端和走到右端所需的时间,容易算出。
n  如果我们能知道,以左端为起点到达地面的最短时间,和以右端为起点到达地面的最短时间,那么向左走还是向右走,就很容选择了。
n  因此,整个问题就被分解成两个子问题,即Jimmy 所在位置下方第一块板左端为起点到地面的最短时间,和右端为起点到地面的最短时间。这两个子问题在形式上和原问题是完全一致的。
n
代码在编译错误了N次,WA了一次后终于AC。
编译错误是因为资料用了好多C不允许但C++允许的格式。。。崩溃。长记性了。
#include #include #include #define INF 1000000 struct Platform { int lx,rx,h; }p[1010]; // 注意数组大小,要不会WA int leftmin[1010]; int rightmin[1010]; int n,MAX; int compare(const void * e1, const void * e2)//比较板高度,主函数中的快排要调用 { struct Platform * p1, * p2; p1 = (struct Platform * ) e1; //C 的话 一定要写上struct 要不编译错误 p2 = (struct Platform * ) e2; return p2->h - p1->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; } } /*********************************main*********************************/ int main(void) { 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); qsort( p,n+1,sizeof(struct Platform),compare ); //快排,按板子高度从高到低排 printf("%d/n",mintime(0,1)); } return 0; }
 将板子从上到下从1 开始进行无重复的编号(高度相同的板子,哪块编号在前无所谓),那么,和上面两个子问题相关的变量就只有板子的编号。

你可能感兴趣的:(poj,DP——动态规划)