POJ1088滑雪問題 簡單dp(動態規劃)已AC

2021-08-04 19:59:26 字數 2426 閱讀 8556

滑雪

time limit:1000ms

memory limit:65536k

total submissions:99422

accepted:37756

description

michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長底滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 

1  2  3  4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

乙個人可以從某個點滑向上下左右相鄰四個點之一,當且僅當高度減小。在上面的例子中,一條可滑行的滑坡為24-17-16-1。當然25-24-23-...-3-2-1更長。事實上,這是最長的一條。

input

輸入的第一行表示區域的行數r和列數c(1 <= r,c <= 100)。下面是r行,每行有c個整數,代表高度h,0<=h<=10000。

output

輸出最長區域的長度。

sample input

5 5

1 2 3 4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

sample output

25
第一次做:直接輸出長乘寬.....沒有考慮到人家不一定按迴旋型輸入。只好刪掉t.t

第二次做:找到最高的那個滑坡,從它開始上下左右尋找最接近它高度的滑坡,以此類推,直到到最低。。。wa???然後默默想了十分鐘,

oh!oh!oh!最高的滑坡不一定只有乙個!!!一大堆**,刪掉。t.t

第三次做:終於明白了題目深意,dp(動態規劃),比如25這個滑坡,要依次考慮24,20,18,22滑坡到底端的最長路徑,而例如24,又要依次考慮15,17,23

到底端的最長路徑……以此類推最後找到1到底端的最長路徑。

(str=store儲存)(ski=滑雪=滑坡)(博主不知道滑坡英語是啥....)

我們用乙個str[101][101]陣列儲存對應ski[101][101]中對應滑坡各自的最優解,這樣我們就沒必要每次算乙個滑坡的最優解都要

不斷遞迴直到底端,然後依次求出最優解,最後再得到此滑坡的最優解,這個過程會重複許多次,所以我們只需將已經算出最優解滑坡記下來,下次

到這個滑坡時直接讀取就好,可以省下一大筆時間(如果一直遞迴會超時的)

何為動態規劃:(博主表達能力不好,就上網搜了易懂的解釋)

動態規劃演算法的基本思想是:將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解;對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來,讓以後再次遇到時直接引用答案,不必重新求解。動態規劃演算法將問題的解決方案視為一系列決策的結果,與貪婪演算法不同的是,在貪婪演算法中,每採用一次貪婪準則,便做出乙個不可撤回的決策;而在動態規劃演算法中,還要考察每個最優決策序列中是否包含乙個最優決策子串行,即問題是否具有最優子結構性質。

測試資料:

3 410 9 8

2 3 3

10 8 1

5 4 3

43 3

6 6 6

6 6 6

6 6 6

14 4

1 2 2 1

1 3 3 1

1 4 4 1

1 2 2 1

41 5

1 2 4 3 4

36 6

8888 9999 8888 7777 7778 7776

8887 9000 10000 7000 7900 10000

8889 9001 9889 9988 7199 10000

4444 5555 6666 7777 7776 8989

3399 5555 4444 8739 9024 3843

10000 9999 9999 2222 1111 4748

7

#include #include using namespace std;

int r,c;//r是行,c是列

int ski[101][101];//滑坡高度

int str[101][101];//儲存每個滑坡到地面的最長路徑

int dp(int row,int col);//row=行,col=列,搜尋每個滑坡的最優解

int main()

cout<=0&&ski[row-1][col]=0&&ski[row][col-1]

POJ1088 滑雪(簡單dp

題目要求 乙個人可以從某個點滑向上下左右相鄰四個點之一,當且僅當高度減小。求可以滑落的最長長度。題目解析 首先要先排一下序,因為只能高度遞減才能滑行。之後就很簡單了,就是簡單dp。即 要求的滑坡是一條節點遞減並依次相鄰的最長路徑,可以先根據高度將所有的點進行排序,在i點的時候,遍歷0 i 1個點 公...

poj 1088 滑雪問題

這題剛開始我想到的是搜尋,但是超時了,所以要進行優化,聽說這是dp經典題,當時就瘋了,dp才初學,想到的是 dp i,j max dp 四個方向 但寫出來不太理想,主要是不懂的遞迴間數值的變化,導致一直出不來答案!後來看題解啊,改啊,搞啊,許久才出來個能a的 並且還0ms了,看來還得多熟悉下 inc...

poj 1088 滑雪問題

題目大意 中文。不解釋 解題思路 動態規劃,這裡要求從乙個點往上下左右移動,要滿足高度差,我們可以把每個位置記錄儲存好,按照高度,從小到大排列,然後利用動態規劃往乙個高度增長的方向就可以處理,轉換為類似於最長遞增子串行問題 include include include include using ...