給定長度n,m的字串a,b,有3種操作(略),問字串a變成b最少操作次數 (n, m<= 1000).dp[i][j] 表示的是 s 1..i 變為 t 1…j 所需要的最少操作:
故可分為三種情況討論:
1.刪除s最,後乙個字元:顯然上一狀態為 s1…i-1 == t1…j
2.s後新增乙個字元:同理上一狀態為 s1…i == t1…j-1
3.修改s最後乙個字元:上一狀態 s1…i-1 == t1…j-1,這種情況下顯然若si == tj,則可以簡化,即
不小號操作次數.
#include #include #include #include using namespace std;
const int n = 2010;
int dp[n][n];
char s[n], t[n];
int main ()
}cout << dp[n][m] << endl;
return 0;
}
the end; 線性DP 最短編輯距離
現在給定兩個字串a和b,現在要將a經過若干操作變為b,可進行的操作有 刪除 將字串a中的某個字元刪除。插入 在字串a的某個位置插入某個字元。替換 將字串a中的某個字元替換為另乙個字元。請問將a變為b至少需要進行多少次操作。輸入格式 第一行包含整數n,表示字串a的長度。第二行包含乙個長度為n的字串a。...
最短編輯距離 dp
兩個序列s和t,求 由s變成t所需得最小編輯次數 字串a 編輯操作 字串b 只討論刪除 插入 替換3種編輯操作 1 問題結構分析 問題表示 d i,j 字串s 1.i 變為t 1.j 的最小編輯距離 明確原始問題 d n,m 字串s 1.n 變為t 1.m 的最小編輯距離 由於我們只操作s串 刪除 ...
簡單線性DP總結
首先 動態規劃適用的條件是該問題有最優子結構 無後效性 通過每個最優子結構狀態的遞推可以推出整體的最優解 對這些基本概念的理解既要理性也要一點點感性 dp問題解決順序是 1 確定狀態 通過最後一步將問題轉化為規模更小的子問題 2 轉移方程 3 初始條件與邊界情況 4 計算順序 其中前兩步是十分重要的...