題解 滑雪 luogu1434 記憶化搜尋

2022-08-19 08:06:06 字數 1765 閱讀 9233

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

123

451617

1819615

2425207

1423

2221813

1211

109

乙個人可以從某個點滑向上下左右相鄰四個點之一,當且僅當高度減小。

在上面的例子中,一條可行的滑坡為24-17-16-1(從24開始,在1結束)。

當然25-24-23―┅―3―2―1更長。事實上,這是最長的一條。

輸入格式:

輸入的第一行為表示區域的二維陣列的行數r和列數c(1≤r,c≤100)。

下面是r行,每行有c個數,代表高度(兩個數字之間用1個空格間隔)。

輸出格式:

輸出區域中最長滑坡的長度

輸入樣例

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

輸出樣例

25
記憶化搜尋

記憶化搜尋本質上是搜尋的一種

但它保證了,每一層回溯得到的結果都具有子最優性質

所以又具有了動態規劃的特徵

(i,j) 為當前所在的座標

#include#include

#include

#include

#define re register int

using

namespace

std;

const

int max_size=110

; int

n,m;

int dir[4][2]=,,,};

inth[max_size][max_size],dp[max_size][max_size];

int inmap(int x,int

y) int max2(int a,int b,int c,int

d) int dfs(int i,int

j) nx=i+dir[1][0]; ny=j+dir[1][1

];

if(inmap(nx,ny))

nx=i+dir[2][0]; ny=j+dir[2][1

];

if(inmap(nx,ny))

nx=i+dir[3][0]; ny=j+dir[3][1

];

if(inmap(nx,ny))

dp[i][j]=max2(up,down,left,right)+1

;

return

dp[i][j];

} int

main()

} int ans=-1

;

for(re i=0;i)

} printf(

"%d\n

",ans);

}

view code

題解 滑雪 luogu1434 記憶化搜尋

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

題解 P1434 滑雪

題目鏈結 此題運用功能強大的 暴力搜尋 記憶化搜尋才是重點!然而,這是一道經典的dp問題 如果我們用 dis i j 來表示座標為 i,j 時的高度 cnt i j 是我們的記憶化陣列 在合法的前提下,就有狀態轉移方程 dis i j max dis i 1 j dis i j 1 dis i 1 ...

洛谷1434滑雪題解

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