記憶化搜尋(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其實一種激發函式形式。通常情況下,如果激發函式採...