設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種:
1、刪除乙個字元;
2、插入乙個字元;
3、將乙個字元改為另乙個字元;
!皆為小寫字母!
第一行為字串a;第二行為字串b;字串a和b的長度均小於2000。
只有乙個正整數,為最少字元操作次數。
輸入 #1複製
sfdqxbw輸出 #1複製gfdgw
4題解:
用f[i][j]表示a串中前i個字母和b串中前j個字母的最小運算元
有變和不變兩種情況
不變:a[i] = b[j]時,f[i][j] = f[i - 1][j - 1];
變:增加:f[i][j] = f[i][j - 1] + 1
減少:f[i][j] = f[i - 1][j] + 1
改變:f[i][j] = f[i - 1][j - 1] + 1
code
1 #include 2view code#define dbug(x) cout << #x << "=" << x << endl
3#define eps 1e-8
4#define pi acos(-1.0)56
using
namespace
std;
7 typedef long
long
ll;8
9const
int inf = 0x3f3f3f3f;10
11 templateinline void read(t &res)
1217
18const
int maxn = 2e5 + 7;19
20string
a, b;
21int f[2007][2007
];22
23int
main()
2432
for ( int i = 0; i <= lenb; ++i )
35for ( int i = 1; i <= lena; ++i )
40else43}
44}45 cout << f[lena][lenb] <
46return0;
47 }
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
要把兩個字串變成相同的字串 一共可以利用以下三種操作 1 把串中任意乙個字元刪去 2 在串中任意乙個位置插入乙個字元 3 把串中任意乙個字元變成其他任意字元 問至少要多少次操作才能讓兩個字串相同?狀態 設 f i j 為把 s1 0 s1 i 1 變為 s2 0 s2 j 1 所需要的步數。對於 f...
P2758 編輯距離
p2758 編輯距離 設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元 皆為小寫字母!輸入格式 第一行為字串a 第二行為字串b 字串a和b的長度均小於2000。輸出格式 只有乙個正整數,...