小談記憶化搜尋

2022-05-10 05:45:52 字數 1617 閱讀 6125

引言

一般地,動態規劃總要遍歷全部的狀態,而搜尋可排除一些無效狀態,特別是搜尋可進行剪枝,減小空間開銷。

如何協調動態規劃的高效率與高消費間的矛盾呢?

乙個折中的方法是記憶化搜尋。在求解時,它依然按照自頂向下的順序,只是每求解乙個狀態就將解儲存,以後再遇到這種狀態時,就不必重新求了。

--《演算法競賽寶典》

例題 洛谷p1434 滑雪

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(從24開始,在1結束)。當然25-24-23―┅―3―2―1更長。事實上,這是最長的一條。

輸入的第一行為表示區域的二維陣列的行數r和列數c(1≤r,c≤100)。下面是r行,每行有c個數,代表高度(兩個數字之間用1個空格間隔)。

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

1

/*注意:本題求的是最大的高度,即走幾次再+1。

*/2 #include3 #include4 #include5 #include6

using

namespace

std;

7int

n,m,ans,zx,zy;

8int h[500][500];9

int f[500][500

];10

int dx[5]=;//

記錄上下左右走的方法,注意陣列從0開始作為下標

11int dy[5]=;

12int msearch(int i,int

j);13

intmain()

1422}23

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

2430

}31 printf("%d"

,ans);

32return0;

33}34int msearch(int i,int

j)35

45 f[i][j]=t;//

記憶化搜尋關鍵之2,都搜完後記錄。

46return

t;47 }

昨日小測中的題目略微有所改動。

題目如下:

香穗子在田野上調蘑菇!她跳啊跳,發現自己很無聊,於是她想了乙個有趣的事情,每個格仔最多只能經過1次,且每個格仔都有其價值

跳的規則是這樣的,香穗子可以向上下左右四個方向跳到相鄰的格仔,並且她只能往價值更高(這裡是嚴格的大於)的格仔跳.

香穗子可以從任意的格仔出發,在任意的格仔結束,

那麼她最多能跳幾次?

本質也是記憶化搜尋。另外需注意兩點。

1.問的是跳幾次,不同於求高度,最後需-1;

2.「每個格仔最多只能通過1次」不需另做處理。

記憶化搜尋

演算法上依然是搜尋的流程,但是搜尋到的一些解用 動態規劃 的那種思想和模式作一些儲存。一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求...

記憶化搜尋

記憶化搜尋 演算法上依然是搜尋的流程,但是搜尋到的一些解用動態規劃的那種思想和模式作一些儲存。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求解乙個狀態,就將它的解儲存下來,以後再次遇到這個狀態的時候,就不必重新求解了。例1.題目描述 給從左至右排好隊的小朋友們分糖果,要求 1.每個小朋友都...

記憶化搜尋

原文 感謝作者。一.動態規劃 動態規劃 dynamic programming 與 分治思想 有些相似,都是利用將問題分 為子問題,並通過合併子問題的解來獲得整個問題的解。於 分治 的不同之處在 於,對於乙個相同的子問題動態規劃演算法不會計算第二次,其實現原理是將每乙個計算過的子問題的值儲存在乙個表...