POJ 1088 滑雪 記憶化搜尋經典

2021-10-05 06:59:55 字數 1784 閱讀 5188

time limit:1000ms

memory limit:65536k

total submissions:107380

accepted:40919

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。

輸出最長區域的長度。

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
source

shtsc 2002

有意思的一道題目,dfs 上下左右搜,記錄當前點的最優值。

注意範圍:一開始把高度最低的點設為終點,顯然這樣是不對的,因為可能最後到達次低點的路徑更長,或者到達次次低點的路徑更長。所以終點就是最後不能再滑的點,無需預先找出來標記,最後在總的路徑長度基礎上加一即可。

ac code:

1 #include 2 #include 3 #include 4 #include 5 #include 6

#define ll long long int

7#define inf 0x3f3f3f3f

8using

namespace

std;910

const

int maxn = 102;11

intmmp[maxn][maxn];

12int

d[maxn][maxn];

13int

n, m;

14bool ok(int x, int

y)15

19int dfs(int x, int

y)20

27if(ok(x+1, y) && mmp[x+1][y]2832

if(ok(x, y-1) && mmp[x][y-1]3337

if(ok(x, y+1) && mmp[x][y+1]3842

return

d[x][y];43}

4445

intmain()

4654

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

55for(int j = 1; j <= m; j++)

56 ans =max(ans, dfs(i, j));

57 printf("

%d\n

", ans+1

);58

return0;

59 }

POJ 1088 滑雪 記憶化搜尋

滑雪 time limit 1000ms memory limit 65536k total submissions 79619 accepted 29637 description michael喜歡滑雪百這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你...

POJ 1088 滑雪 記憶化搜尋

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

POJ 1088 滑雪 記憶化搜尋

滑雪 time limit 1000ms memory limit 65536k total submissions 84463 accepted 31618 description michael喜歡滑雪百這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你...