1276 例9 20 P2758 編輯距離

2022-04-08 01:19:24 字數 1532 閱讀 1044

題目傳送門[(

設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種:

1、刪除乙個字元;

2、插入乙個字元;

3、將乙個字元改為另乙個字元;

!皆為小寫字母!

第一行為字串a;第二行為字串b;字串a和b的長度均小於2000。

只有乙個正整數,為最少字元操作次數。

輸入 #1

sfdqxbw

gfdgw

輸出 #1

注意到刪除a[i] 等價於 在b[i]前 插入

在a[i]前插入與b[i]相同的元素 等價於 刪除 b[i]

修改a[i] 等價於 修改b[i]

為啥?因為這樣的兩種操作,都增加了一次操作次數,最終帶來了同樣的結果

所以,我們只需要對乙個串操作,最終的結果沒有影響

只對b操作

f[i][0] = i;

f[0][j] = j;

如果a[i]等於b[i],不做修改,f[i][j] = f[i - 1][j - 1]

否則,三種修改方式,在b中加乙個,f[i][j] = f[i - 1][j] + 1;

在b中刪乙個,f[i][j] = f[i][j - 1] + 1;

在b中改乙個,f[i][j] = f[i - 1][j - 1] + 1;

三者取min

#include #include #include #include #include #include #define n 2010

#define inf 1061109000

using namespace std;

int f[n][n], n1, n2;

string a , b;

int main()

f[0][0] = 0;

f[0][1] = 1;

f[1][0] = 1;

for (int i = 0 ; i <= a.size() ; i++) f[i][0] = i;//重要的初始化

for (int j = 0 ; j <= b.size() ; j++) f[0][j] = j;//重要的初始化

//只編輯b

for (int i = 1 ; i <= a.size() ; i++)

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

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

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

// cout << i << " " << j << " " << f[i][j] << endl;

} }/* for (int j = 1 ; j <= a.size() ; j++) */

cout << f[a.size()][b.size()] << endl;

return 0;

}

P2758 編輯距離

p2758 編輯距離 設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元 皆為小寫字母!輸入格式 第一行為字串a 第二行為字串b 字串a和b的長度均小於2000。輸出格式 只有乙個正整數,...

P2758 編輯距離

p2758 編輯距離 危樓還望,嘆此意 今古幾人曾會?鬼設神施,渾認作 天限南疆北界。一水橫陳,連崗三面,做出爭雄勢。六朝何事,只成門戶私計?題目描述 設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元...

P2758 編輯距離 DP

傳送門 思路 經典兩個字串匹配的dpdp dp,找到狀態轉移方程即可。這裡提供兩種寫法,dpdp dp,記憶化搜尋。實質一樣。p s ps ps 記憶化搜尋看著舒服一些。d pdp dp include using namespace std typedef long long ll const i...