演算法 動態規劃演算法求解字串的編輯距離

2021-07-07 09:41:13 字數 1188 閱讀 6323

當有人讓你用遞迴演算法求解斐波那契數列以及字串的編輯距離時,所設的陷阱都是一致的(遞迴呼叫時的重複計算),解決方案也是一致的(引入備忘錄概念)。觀察樹形的層級呼叫關係,我們可以發現動態規劃隱式地嵌入了一種剪枝機制。

關於樸素遞迴求解菲波那切數列存在的重複計算的說明:

紅色部分均是重複計算項,當遞迴呼叫的層次更多時,重複計算的問題更為嚴重。

現在我們應用動態規劃的思想對樸素遞迴演算法進行改造,所謂動態規劃,其核心有二:

狀態的概念

為遞迴介面增加狀態標識引數

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 ...

演算法 動態規劃演算法

動態規劃法基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。著名的應用例項有 求解最短路徑問題,揹包問題,專案管理,網路流優化等。個人對動態規劃的理解,主要就是避免重複計算。就是那些曾經發生過的事情,曾經計算過的值先儲存下來,然後再次遇到相同的子問題的時候,直接用儲存...

演算法 動態規劃演算法

動態規劃法基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。著名的應用例項有 求解最短路徑問題,揹包問題,專案管理,網路流優化等。個人對動態規劃的理解,主要就是避免重複計算。就是那些曾經發生過的事情,曾經計算過的值先儲存下來,然後再次遇到相同的子問題的時候,直接用儲存...