現在給定兩個字串a和b,現在要將a經過若干操作變為b,可進行的操作有:
刪除 將字串a中的某個字元刪除。
插入 在字串a的某個位置插入某個字元。
替換 將字串a中的某個字元替換為另乙個字元。
請問將a變為b至少需要進行多少次操作。
輸入格式
第一行包含整數n,表示字串a的長度。
第二行包含乙個長度為n的字串a。
第三行包含整數m,表示字串b的長度。
第四行包含乙個長度為m的字串b。
字串中均只包含大寫字母。
輸出格式
輸出乙個整數,表示最少操作次數。
資料範圍
1≤n,m≤1000
輸入樣例:
10agtctgacgc
11agtaagtaggc
輸出樣例:
4集合表示f(i,j)表示a串前i個字母經轉換得到b串前j個字母的所有方案數集合
屬性表示f(i,j)這些方案數的最小值
狀態表示
考慮最後一步對a串第i個位置的操作 只能是增,刪,改三步操作
增:則需要滿足 a串的前i個字母已經跟b串的前j-1個字母已經相等
刪:則需要滿足a串的前i-1個字母已經和b串的前j個字母已經相等
改:考慮兩種情況 可能a串的第i個字母已經和b串的第j個字母已經相等 則不需要改
則只需要滿足a的前i-1個字母和b的前j-1個字母相等即可
若a的第i個字母與b的第j個字母不相等 則需要修改 還是需要滿足a的前i-1個字母和b的前j-1個字母相等即可
綜上 狀態表示方程為f(i,j)=min(f(i,j-1)+1,f(i-1,j)+1,f(i-1,j-1)+1/0)
這題需要注意邊界層處理!
#include
#include
#include
using
namespace std;
const
int n =
1010
;int n,m;
char s1[n]
,s2[n]
;int f[n]
[n];
intmain()
} cout<[m];
return0;
}
最短編輯距離 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 最短編輯距離
給定長度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 t...
ACwing 902最短編輯距離 (線性dp
給出兩個字串a,b,三種操作 刪除a中某個字元 a中插入乙個字元 修改a中某個字元 問將a變成b最小的操作步數。dp i j 表示將a 1 i 變成b 1 j 的最小步數 狀態轉移 對於每個a i 有三種操作 刪除a i dp i j dp i 1 j 1a i 後面插入b j dp i j dp ...