\(\color}\)
設 \(a\) 和 \(b\) 是兩個字串。我們要用最少的字元操作次數,將字串 \(a\) 轉換為字串 \(b\) 。這裡所說的字元操作共有三種:
1、刪除乙個字元;
2、插入乙個字元;
3、將乙個字元改為另乙個字元;
皆為小寫字母
\(\color}\)
第一行為字串 \(a\) ;第二行為字串 \(b\);
\(\color}\)
只有乙個正整數,為最少字元操作次數。
\(\color}\)
字串 \(a\) 和 \(b\) 的長度均小於\(2000\)
\(\color}\)
考慮用dp
令 \(dp[i][j]\) 表示字串 \(a\) 的前 \(i\) 位轉換為字串 \(b\) 的前 \(j\) 位需要最小的操作次數
再考慮狀態的轉移.這裡有個小彎,其實操作一與操作二可以歸為乙個狀態,因為仔細想想就知道沒有區別.
所以得出狀態轉移方程
\[dp[i][j]=\begindp[i-1][j-1]&(a[i]=b[j])\\max(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1&(a[i]\neq b[j])\end\ \ \ \ (1 \leq i \leq lengtha, 1 \leq j \leq lengthb)
\]初始化 \(dp[i][0]=i\),\(dp[0][j]=j\)
\((1 \leq i \leq lengtha, 1 \leq j \leq lengthb)\)
\(\color}\)
#include #define ll long long
#define reg register
using namespace std;
const int klen = 2e3 + 10;
int dp[klen][klen];
char a[klen], b[klen];
int main() else
} printf("%d\n", dp[lena][lenb]);
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...