OJ 1088 滑雪 動態規劃

2021-07-24 15:42:21 字數 1679 閱讀 5697

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更長。事實上,這是最長的一條。

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

輸出最長區域的長度。

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

對每個點遞迴求解最大長度,遍歷完成後最大點就出來了。

#include 

#include

#include

using

namespace

std;

int a[102][102];

//狀態:len[i][j]表示從(i,j)點從能走的最大長度

int len[102][102];

int maxlen = 1;

int calcpathlength(int i, int j, int lastrow, int lastcolumn)

//狀態轉移方程

int templen[4];

templen[0] = a[i][j] > a[i][j - 1] ? calcpathlength(i, j - 1, lastrow, lastcolumn) + 1 : 1;

templen[1] = a[i][j] > a[i - 1][j] ? calcpathlength(i - 1, j, lastrow, lastcolumn) + 1 : 1;

templen[2] = a[i][j] > a[i][j + 1] ? calcpathlength(i, j + 1, lastrow, lastcolumn) + 1 : 1;

templen[3] = a[i][j] > a[i + 1][j] ? calcpathlength(i + 1, j, lastrow, lastcolumn) + 1 : 1;

len[i][j] = *max_element(templen, templen + 4);

if (len[i][j] > maxlen)

return len[i][j];

}int main()

}for (int j = 0; j <= lastcolumn; j++)

for (int i = 1; i <= r; i++)

}cout

<< maxlen << endl;

return

0;}

1088 滑雪(動態規劃)

總時間限制 1000ms 記憶體限制 65536kb 描述michael喜歡滑雪百這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長的滑坡。區域由乙個二維陣列給出。陣列的每個數字代表...

動態規劃 POJ 1088 滑雪

意思就是把所有點存下來,按照高度排個序,然後從小到大列舉,然後判斷當前的點的四個方向有沒有存在經過當前點更優的情況,並且那個點的高度比當前點的高度要高如果存在就更新,因為根據大小排了序,所以不會出現不會出現乙個點重複統計的情況那麼複雜度是o n2 include include include us...

動態規劃之滑雪 百練1088

描述 null 解題思路 解法1 人人為我 式遞推 l i,j 表示從點 i,j 出發的最長滑行長度。乙個點 i,j 如果周圍沒有比它低的點,l i,j 1.將所有點按高度從小到大排序。每個點的l值都初始化為1,從小到大遍歷所有的點,經過乙個點 i,j 時,用遞推公式求l i,j 遞推公式 l i,...