POJ1661Help Jimmy(動態規劃)

2021-06-18 03:12:18 字數 2694 閱讀 6544

description

"help jimmy" 是在下圖所示的場景上完成的遊戲。

場景中包括多個長度和高度各不相同的平台。地面是最低的平台,高度為零,長度無限。

jimmy老鼠在時刻0從高於所有平台的某處開始下落,它的下落速度始終為1公尺/秒。當jimmy落到某個平台上時,遊戲者選擇讓它向左還是向右跑,它跑動的速度也是1公尺/秒。當jimmy跑到平台的邊緣時,開始繼續下落。jimmy每次下落的高度不能超過max公尺,不然就會摔死,遊戲也會結束。

設計乙個程式,計算jimmy到底地面時可能的最早時間。

input

第一行是測試資料的組數t(0 <= t <= 20)。每組測試資料的第一行是四個整數n,x,y,max,用空格分隔。n是平台的數目(不包括地面),x和y是jimmy開始下落的位置的橫豎座標,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)。所有座標的單位都是公尺。

jimmy的大小和平台的厚度均忽略不計。如果jimmy恰好落在某個平台的邊緣,被視為落在平台上。所有的平台均不重疊或相連。測試資料保證問題一定有解。

output

對輸入的每組測試資料,輸出乙個整數,jimmy到底地面時可能的最早時間。

sample input

1

3 8 17 20

0 10 8

0 10 13

4 14 3

sample output

23
思路:

關鍵:運用遞迴的思想用動態規劃的陣列實現

方法:將輸入的資料按高度由高到底排序,然後從最高乙個向下遞迴,根據條件判斷做出相應的動作,利用陣列儲存相應的時間

實現考慮:

1.不妨認為jimmy開始的位置是乙個編號為0,長度為0的板子,那麼整個問題就是要求leftmintime(0)。

2. 輸入資料中,板子並沒有按高度排序,所以程式中一定要首先將板子排序。

3. leftmintime(k)和rightmintime(k)可以用同乙個過程來實現(用乙個布林變數來區分)此處程式

用的flag

#include #include #include using namespace std;

const long int inf = 1000000;

int ncases;//宣告乙個變數儲存一共幾組資料

int n;//平台的數目

int x;//開始下落點的橫座標

int y;//開始下落點的豎座標

int nmax;//一次下落的做大高度

//定義乙個結構體,儲存各板子的狀態:板子左右橫座標和y座標

struct platform

p[1010];

//定義兩個陣列分別儲存從左邊和右邊下落的最短時間

int leftmin[1010];

int rightmin[1010];

//快速排序過程中用到的比較函式

int compare(const void *e1, const void *e2)

//確定最短時間到達地面

int mintime(int l, int flag)//l表示哪一塊木板,flag表示哪一端,0表示左端,1表示右端

else

//從起點下面的一塊木板開始遍歷

for(i = l + 1; i <= n; ++i)

//對於起點下面有木板的情況

if(i <= n)

else //對於起點下面沒有木板的情況

//起點下面有木板且距離第一塊木板高度不超過max

ltime = y - p[i].h + x - p[i].lx;//從起點到i木板的左端的時間

rtime = y - p[i].h + p[i].rx - x;//從起點到i木板的右端的時間

//遞迴實現各木板到地的時間

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)//判斷左邊和右邊的時間

else

}int main()

//將各平台按高度由高到低排序

//qsort的原型 void qsort(void *base, int elem, int width, int(*fcmp)(const void *, const void *));

//2.陣列中排序元素數量

//3.各元素的占用空間大小

//4.指向函式的指標,確定排序的順序

qsort(p, n + 1, sizeof(struct platform), compare);

cout << mintime(0, 1) << endl;

}return 0;

}

poj1661 Help Jimmy dp動態規劃

help jimmy description help jimmy 是在下圖所示的場景上完成的遊戲。場景中包括多個長度和高度各不相同的平台。地面是最低的平台,高度為零,長度無限。jimmy老鼠在時刻0從高於所有平台的某處開始下落,它的下落速度始終為1公尺 秒。當jimmy落到某個平台上時,遊戲者選擇...

poj 1661 Help Jimmy 動態規劃

題意 給n個用左端點 右端點 高度標識的平台,問乙個下落速度,移動速度均為1的點下落到地面的最小時間,其中每次下落距離不能超過輸入值max.分析 動態規劃ldp i 表示從第i塊木板左邊下落到地面的最小時間,rdp i 表示從第i塊木板右邊下落到地面的最小時間。poj 1661 sep9 inclu...

poj 1661 Help Jimmy 動態規劃

poj 1661 help jimmy help jimmy time limit 1000ms memory limit 10000k total submissions 13143 accepted 4363 description help jimmy 是在下圖所示的場景上完成的遊戲。場景中包...