LuoGu P2758 編輯距離

2022-05-31 03:06:16 字數 1103 閱讀 6263

\(\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...