[POJ - 1661]ヘルプジミー(動的プログラミング)

ヘルプジミー


説明:

「ヘルプジミーは、」図に示した次のゲームシーンに行われます。 


インターネットの異なる長さと高さの複数を含むシーン。地面は、ゼロの最小プラットフォーム高さ、無制限の長さです。 

ジミーマウスは、すべてのプラットフォームよりもどこかに高いから時間0で落ちるようになった、それは常に1メートル/秒の速度を下降ます。ジミーは、プラットフォームになると、プレイヤーはそれを左または右に実行させることを選択し、それがスピードを実行していることは1メートル/秒です。ジミーはプラットフォームの端に行き、下がり続けるようになったとき。ジミーは、高さのすべてのドロップは、ゲームが終了し、そうでなければ、彼らの死に落ちる、MAXメートルを超えてはなりません。 

地上できるだけ早い時期の終わりにジミーを計算するプログラムを設計します。 

入力

最初の行は、テストデータTの組の数である(0 <= T <= 20)。各テストの最初の行は、4つの整数N、X、Y、MAX、スペースで区切られています。Nは、(接地を含まない)プラットフォームの数であり、X及びY座標は、水平、ジミー落下開始位置であり、MAXは落下の最大高さです。次のNラインは三つの整数、X1を含む、プラットフォームを説明[I]、X2 [ I] とH [i]は。H [i]は、プラットフォームの高さを表し、X1 [i]とX2 [i]を横軸周りのプラットフォームのエンドポイントを表します。1 <= N <= 1000、 -20000 <= X、X1 [i]は、X2 [I] <= 20000,0 <H [I] <Y <= 20000(i = 1..N)。全ての座標の単位はメートルです。 

ジミー・プラットフォームの大きさと厚さは無視できます。ジミーはちょうどプラットフォームの端にある場合は、プラットフォーム上に落下するとみなされます。すべてのプラットフォームは、重複したり参加しません。テストデータは、問題が解けるでなければならないことを確実にします。 

出力

地面の最後にテストデータ入力、出力、整数、ジミーの各セットは、最も早い時間であってもよいです。

サンプル入力

1

3 8 17 20

0 10 8

0 10 13

4 14 3

サンプル出力

23

トピックリンク:

https://vjudge.net/problem/POJ-1661

 

DPの動的プログラミング、下から見上げ、DP [I] [2] [i]が[0]最後に最短時間最も左のi番目のプラットフォームを表し、DP [i]は[1]右端最短プラットフォームの端に表します時間。

状態遷移式:DP [I] [1]〜[I] .ha [K]・H +分(DP [K] [0] + [I] .x2 - [K] .x1、DPを[= K] [1] + [K] .x2 - [I] .x2); //右

       DP [I] [0] [i]は.haを= [K]・H +分(DP [K] [0] + [I] .x1、[K] .x1、DP [K] [1 ] + [K] .x2 - [I] .x1)。//左

 ACコード

1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include <fstreamの>
 4の#include <アルゴリズム>
 5の#include <cmath>
 6の#include <両端キュー>
 7の#include <ベクトル>
 8の#include <キュー>
 9#含む< ストリング >
 10の#include <CStringの>
 11の#include <地図>
 12の#include <積層>
 13の#include < 設定 >
 14の#include <数値>
 15  のconst  int型 INF = 0x3f3f3f// 無限大
16 使用して 名前空間STDを、
 図17のtypedef ロング ロングLL;
 18である INT T;
 19  INT N、X、Y、MAXH;
 20  // 0の最後に最小時間左端インターネットi番目の意味
 21  @ 1はi番目のインターネット右端を表します最後に最小時間
22は、 INT DP [ 1010 ] [ 2 ];
 23である 構造体ノード
 24  {
 25      のint ; X1、X2、H
 26である };
 27  BOOL CMP(ノード、ノードB)// H降順
28  {
 29      リターン AH> BH。
30  }
 31ノード[ 1010 ]。
32  ボイド LeftTime(INT I)// 
33  {
 34      のint、K = I + 1 35      一方(K <N + 1 && [I] .ha [K]・H <= MAXH)
 36      {
 37          であれば([I] .x1> = [K] .x1 && [I] .x1 <= [ ] .x2)ここで、k
 38          {
 39              DP [i]が[ 0 ] [i]は.ha [K]・H +分(DP [K] [= 0 ] + [I] .x1 - [k]を。 X1、DP [K] [ 1 ] + [K] .x2- [I] .x1)。
40              リターン41である         }
 42が          ++ K ;
 43である     }
 44が    IF([I] .ha [K]・H> MAXH)// 次のプラットフォームに到達することができない
45          DP [I] [ 0 ] = INF;
 46である     // 直接着陸
47          DP [I] [ 0 ] = [I]・Hと、
 48  
49      リターン;
 50  }
 51れる 空隙 RightTimeは(INT I)// 
52である {
 53が     INT K = I + 1 ;
 54であり     、一方(K <N +1 && [i]は.ha [K]・H <= MAXH)
 55      {
 56          であれば([I] .x2> = [K] .x1 && [I] .x2 <= [K] .x2)
 57          {
 58               DP [i]が[ 1 ] [i]は.ha [K]・H +分(DP [K] [= 0 ] + [I] .x2 - [K] .x1、DP [k]を[ 1 ] + [K] .x2- [I] .x2)。
59              リターン;
60  
61          }
 62          K ++ 63      }
 64     であれば([I] .ha [K]・H> MAXH)// 不能到达下一平台
65          DP [I] [ 1 ] = INF。
66      // 直接床
67          DP [I] [ 1。 =] [I]・Hと、
 68  
69      リターン;
 70  }
 71であり 、INT (メイン)
 72  {
 73である      CIN >> T;
 74      ながら(T-- 75      {
 76          のmemset (DP、0はsizeof (DP));
 77          A [ 0 ] = .x1 - 20000、A [ 0 ] = .x2 20000、A [ 0 ]・H = 0 ; // 
78         CIN >> N >> X >> Y >> MAXH。
79          [ 1 ] .x1 = X [ 1 ] .x2 = X [ 1 ]・H = Y。// 初始位置
80          のためにint型 I = 2 ; iが<= N + 1 ; I ++ 81          {
 82              CIN >> [I] .x1 >> [I] .x2 >> [I]・H。
83          }
 84          ソート(+ N + 2 、CMP)。
85          のためにint型 iは= N; I> = 0 ; i-- 86          {
 87             LeftTime(I); // 
88              RightTime(I); // 
89          }
 90          INT MINTIME =分(DP [ 0 ] [ 0 ]、DP [ 0 ] [ 1 ])。
91          coutの<< MINTIME << てendl;
92      }
 93      リターン 0 94 }

 

おすすめ

転載: www.cnblogs.com/sky-stars/p/10950157.html