記憶化搜尋:演算法上依然是搜尋的流程,但是搜尋到的一些解用
動態規劃的那種思想和模式作一些儲存。
一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。
更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。
記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求解乙個狀態,就將它的解儲存下來,
以後再次遇到這個狀態的時候,就不必重新求解了。
這種方法綜合了搜尋和動態規劃兩方面的優點,因而還是很有實用價值的。
雖然不能使用傳統意義上的動態規劃解決本題,但動態規劃的思想仍然能起到作用。搜尋相對於動態規劃最大的劣勢無非就是重複計算子結構,所以我們在搜尋的過程中,對於每乙個子結構只計算一次,之後儲存到陣列裡,以後要用到的時候直接呼叫就可以了,這就是我要介紹的記憶化搜尋。
記憶化搜尋的實質是動態規劃,效率也和動態規劃接近,形式是搜尋,簡單直觀,**也容易編寫,不需要進行什麼拓撲排序了。
可以歸納為:記憶化搜尋=搜尋的形式+動態規劃的思想
如下例:
#include#include#include//using namespace std;
int arr[22][22][22];
int sum(int a,int b,int c)
else if(a>20||b>20||c>20)
else if(arr[a][b][c])
else if(a
poj 1579(記憶化搜尋)
consider a three parameter recursive function w a,b,c if a 0 or b 0 or c 0,then w a,b,c returns 1 if a 20 or b 20 or c 20,then w a,b,c returns w 20,20...
POJ 1579 記憶化搜尋
問題描述 自定義函式w a,b,c 如果 a 0 或b 0 或 c 0,則返回結果 1 如果 a 20 或 b 20 或 c 20,則返回結果 w 20,20,20 如果 a b 且 b c,則返回結果 w a,b,c 1 w a,b 1,c 1 w a,b 1,c 否則返回結果 w a 1,b,c...
poj 1579 遞迴 記憶化搜尋
直接遞迴會重複計算一些值,如題所述會花費很長時間。最好的方法就是用記憶化搜尋,用陣列將值記錄下來,當搜到已經計算過的值時直接使用就行了,避免再一次遞迴計算,這樣會節省很多時間。如下 include using namespace std const int size 21 int map size ...