要把兩個字串變成相同的字串
一共可以利用以下三種操作:
1、把串中任意乙個字元刪去;
2、在串中任意乙個位置插入乙個字元;
3、把串中任意乙個字元變成其他任意字元;
問至少要多少次操作才能讓兩個字串相同?
(狀態:設\(f[i][j]\)為把\(s1[0]-s1[i - 1]\)變為\(s2[0]-s2[j - 1]\)所需要的步數。
對於\(f[i][j]\)若相等,直接轉移;否則有三個轉移:
從\(f[i - 1][j - 1]\) (把\(s1[i - 1]\)變為\(s2[j - 1]\))
從\(f[i - 1][j]\) (刪掉\(s1[i - 1]\))
從\(f[i][j - 1]\)(\(s1\)最後填乙個\(s2[j]\))
其實刪除和新增操作兩個是等價的...刪掉乙個相當於給另乙個字串新增乙個......
#includeusing namespace std;
char a[10000],b[10000];
int dp[10000][10000];
int main()
dp[i][j] = min(dp[i - 1][j - 1],min(dp[i][j - 1],dp[i - 1][j])) + 1;
} cout << dp[n][m];
return 0;
}
P2758 編輯距離 DP
傳送門 思路 經典兩個字串匹配的dpdp dp,找到狀態轉移方程即可。這裡提供兩種寫法,dpdp dp,記憶化搜尋。實質一樣。p s ps ps 記憶化搜尋看著舒服一些。d pdp dp include using namespace std typedef long long ll const i...
P2758 編輯距離 dp
設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元 皆為小寫字母!第一行為字串a 第二行為字串b 字串a和b的長度均小於2000。只有乙個正整數,為最少字元操作次數。輸入 1複製 sfdq...
P2758 編輯距離
p2758 編輯距離 設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元 皆為小寫字母!輸入格式 第一行為字串a 第二行為字串b 字串a和b的長度均小於2000。輸出格式 只有乙個正整數,...