最小編輯距離 poj3356

2021-07-30 12:45:53 字數 1264 閱讀 6562

我開始讀題的時候以為弄錯提了。。看來讀題還是有待提高

題意是 給定兩個串,乙個a,b,讓a變成b

有兩種操作 1 增加乙個字元

2 減少乙個字元

3 轉換乙個字元

每一次操作算一次運算元,

問你最小的運算元

在華南農業大學的acm群裡有人問這道題,後來翻了翻,還是挺有意思的,開始以為是最長公共子串,後來大神說有修改最長公共子串毛啊,還發了wiki的連線,大致分為三種

dp[i][j]表示從 a串中i長的子串 到 b串中j長的字串的變化需要運算元。

不怎麼顯然的是,如果i,j有乙個為0,那麼運算元就是 不為0的那個數,j或者i;

否則的話有 狀態轉移方程如**。

具體看 方程

poj不支援 bits/stdc++ …

//#include 

#include

#include

#include

using namespace std;

const int maxn=1005;

//是乙個dp的題,因為有修改操作,所以不是

//最長公共子串這麼簡單的事情啊

/*並且驚奇的發現乙個規律,那就是兩個串相互轉化,操作一樣,

設定dp[i][j],長度為i的子串1 變成長度為j 的子串2 所花費的。

1 當有i和j有乙個為1時,那麼就等於那個不為1的+f[i][j];

(很簡單啊,你只能刪啊或者加啊(逆向))

如果在中間呢,考慮乙個 dp狀態方程吧

dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+f[i][j];

*/int a1,b1;

char a[maxn],b[maxn];

int f[maxn][maxn];

int dp[maxn][maxn];

int dp()

cout

<<"**************"

i=1;i<=a1;i++)

//初始化一樣吧,就是這個套路。

for(int

i=1;i<=b1;i++)

dp[0][i]=i;

for(int

i=1;i<=a1;i++)

}/*for(int

i=0;i*/

cout

<}int

main()

return 0;

}

編輯距離 poj 3356

include define n 1002 char src null,des null int m,n int dis n n main int i,j,k while scanf d m eof src char malloc sizeof char m 1 scanf s src scanf ...

poj 3356 求最短編輯距離

題目大意 給定兩個字串x,y,要你求出x經過插入,刪除,替換變成y所要的最少操作,即編輯距離。當x i y j 時,i和j不需要編輯,要麼刪除,要麼插入,要麼替換 dp i j min dp i 1 j 1 dp i 1 j 1,dp i j 1 1 當x i y i 時,i和j不需要編輯 dp i...

POJ3356 AGTC 題解 最短編輯距離問題

題目大意 求 由字串 s 通過下列三種操作 插入乙個字元 刪除乙個字元 改變乙個字元 變換到字串 t 所需要的最少操作次數 亦即最短編輯距離問題 解題思路 定義狀態 f i j 表示 s 0.i 和 t 0.j 合併所需的最小花費,則可得狀態轉移方程為 字串座標從 1 開始,0 表示乙個都沒選 實現...