線性DP 最短編輯距離

2021-10-21 21:09:18 字數 1150 閱讀 8120

現在給定兩個字串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 ...