題目傳送門[(
設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...