[2016-03-29][POJ][1661][]Help Jimmy]

Posted 红洋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[2016-03-29][POJ][1661][]Help Jimmy]相关的知识,希望对你有一定的参考价值。

  • 时间:2016-03-29 21:36:50 星期二

  • 题目编号:[2016-03-29][POJ][1661][]Help Jimmy]

  1. #include <algorithm>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. int n,x,y,maxh;
  6. struct Plat{
  7. int l,r,h;
  8. bool operator < (const Plat & a)const{
  9. return h < a.h;
  10. }
  11. Plat(int _l = 0,int _r = 0,int _h = 0):l(_l),r(_r),h(_h){}
  12. int canFallOn(int _x,int _h){
  13. return _x >= l && _x <= r && _h >= h && (_h - h) <= maxh;
  14. }
  15. }a[1000 + 10];
  16. int dp[1000 + 10][2];
  17. void toleft(int i){
  18. for(int k = i - 1;k > 0;--k){
  19. if(a[k].canFallOn(a[i].l,a[i].h)){
  20. dp[i][0] = a[i].h - a[k].h + min (a[i].l - a[k].l + dp[k][0], a[k].r - a[i].l + dp[k][1]);
  21. return ;
  22. }
  23. }
  24. if(a[i].h - a[0].h > maxh)
  25. dp[i][0] = 0x7f7f7f7f;
  26. else dp[i][0] = a[i].h;
  27. }
  28. void toright(int i){
  29. for(int k = i - 1;k > 0;--k){
  30. if(a[k].canFallOn(a[i].r,a[i].h)){
  31. dp[i][1] = a[i].h - a[k].h + min (a[i].r - a[k].l + dp[k][0], a[k].r - a[i].r + dp[k][1]);
  32. return ;
  33. }
  34. }
  35. if(a[i].h - a[0].h > maxh)
  36. dp[i][1] = 0x7f7f7f7f;
  37. else dp[i][1] = a[i].h;
  38. }
  39. void dfs(){
  40. Plat tmp(x,x,y);
  41. a[0] = tmp;
  42. a[n + 1] = Plat(-20010,20010,0);
  43. sort(a,a + n + 2);
  44. for(int i = 1 ;i <= n + 1 ;++i){
  45. toleft(i);
  46. toright(i);
  47. }
  48. printf("%d\n",min(dp[n + 1][0],dp[n + 1][1]));
  49. }
  50. int main(){
  51. int t;
  52. scanf("%d",&t);
  53. while(t--){
  54. scanf("%d%d%d%d",&n,&x,&y,&maxh);
  55. for(int i = 1 ; i <= n ; ++i){
  56. scanf("%d%d%d",&a[i].l ,&a[i].r,&a[i].h );
  57. }
  58. dfs();
  59. }
  60. return 0;
  61. }




以上是关于[2016-03-29][POJ][1661][]Help Jimmy]的主要内容,如果未能解决你的问题,请参考以下文章

POJ1661

动规-POJ-1661

POJ1661 Help Jimmy —— DP

poj1661

POJ 1661 Help Jimmy

poj1661 (DP)