當有人讓你用遞迴演算法求解斐波那契數列以及字串的編輯距離時,所設的陷阱都是一致的(遞迴呼叫時的重複計算),解決方案也是一致的(引入備忘錄概念)。觀察樹形的層級呼叫關係,我們可以發現動態規劃隱式地嵌入了一種剪枝機制。關於樸素遞迴求解菲波那切數列存在的重複計算的說明:
紅色部分均是重複計算項,當遞迴呼叫的層次更多時,重複計算的問題更為嚴重。
現在我們應用動態規劃的思想對樸素遞迴演算法進行改造,所謂動態規劃,其核心有二:
狀態的概念
為遞迴介面增加狀態標識引數
i 和j:
int editdist(char* src, char* dst);
改造為(引入狀態的概念):
int editdist(char* src, char* dst, int i, int j);
備忘錄概念
通過定義相關的結構體實現
typedef
struct tagmemorecord
memo_record;
// 作為全域性變數
vector
> memo(100, vector
(100));
int editdist(char* src, char* dst, int i, int j)
int dist = 0;
if (strlen(src+i) == 0)
else
if(strlen(dst+j) == 0)
else
else);}
}memo[i][j].refcount = 1;
return memo[i][j].dist = dist;
}
動態規劃演算法求解最大公共字串
第一次寫部落格,為了激勵自己努力。前幾天在牛客上看到乙個演算法題 查詢兩個字串的最大公共字串長度。自己是演算法小白,學習了下動態規劃的思想,寫了個入門級的 1.先用個例子簡單梳理下分析過程,首先將字串str1 sdjhfdshklhfjk 和字串str2 dffdshklu 以矩陣的形式排列 ps ...
演算法 動態規劃演算法
動態規劃法基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。著名的應用例項有 求解最短路徑問題,揹包問題,專案管理,網路流優化等。個人對動態規劃的理解,主要就是避免重複計算。就是那些曾經發生過的事情,曾經計算過的值先儲存下來,然後再次遇到相同的子問題的時候,直接用儲存...
演算法 動態規劃演算法
動態規劃法基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。著名的應用例項有 求解最短路徑問題,揹包問題,專案管理,網路流優化等。個人對動態規劃的理解,主要就是避免重複計算。就是那些曾經發生過的事情,曾經計算過的值先儲存下來,然後再次遇到相同的子問題的時候,直接用儲存...