記憶搜尋(MS)的深入理解

2022-09-10 17:57:19 字數 982 閱讀 4501

記憶化搜尋(memory search),其實還是用遞迴函式實現的,通常函式名依然叫做dfs。

核心語句就是那兩部分遞迴的關鍵語句塊啦。

函式一開始的判斷出口:if已經搜尋過該部分就return陣列中的值。所以一般將陣列初始化為-1。

以斐波那契數列為例:

函式的遞迴前進語句:return fib[i]=fib[i-1]+fib[i-2];

這樣就做到了陣列的每個值只計算了一次,不會有多餘的時間消耗。

還有一點!記住ms型dfs就必須是int型的了!! 不要在用bool或者void了!

記憶化搜尋的fib求解的**:

#include

using

namespace std;

const

int max =

10000+5

;int fib[max]

;int

dfs(

int n)

intmain()

dfs(max-1)

;//別寫成了max,那樣輸出的全是-1

for(

int i =

1; i<=

50; i++)}

return0;

}

但是對於斐波那契這種簡單的題目來說,用ms解那簡直是大炮打蚊子。直接遞迴就行了

下面是直接遞迴**:

#include

using

namespace std;

int n;

intfib

(int num)

else

}int

main()

對比一下就知道了。

在斐波那契中ms和dp如此相似是因為fib的順序是固定的!有規律的!所以體現不出ms的用處來!但是存在即合理!!!

在下面的題目中就顯示出來ms的優點

藍橋杯 數的劃分 記憶搜尋解法

乙個正整數可以劃分為多個正整數的和,比如n 3時 3 1 2 1 1 1 共有三種劃分方法。給出乙個正整數,問有多少種劃分方法。輸入格式 乙個正整數n 輸出格式 乙個正整數,表示劃分方案數 樣例輸入 樣例輸出 資料規模和約定 n 100 n 個 1 對應的情況是 每乙份劃分的值不大於 1 n 加 0...

深入理解二叉搜尋樹

二叉搜尋樹 二叉搜尋樹是一以二叉樹來組織的,可以用鍊錶的資料結構來表示,每乙個結點就是乙個物件,包括以下的結構 bstnode pleft bstnode pright bstnode parent k key v value 二叉搜尋樹或者是一棵空樹,或者是具有以下性質的二叉樹 1 若它的左子樹不...

Maxout的深入理解

轉之 maxout出現在icml2013上,作者goodfellow將maxout和dropout結合後,號稱在mnist,cifar 10,cifar 100,svhn這4個資料上都取得了start of art的識別率。從 中可以看出,maxout其實一種激發函式形式。通常情況下,如果激發函式採...