目录
题目
算法标签: 动态规划
思路
使用最小操作次数将 A A A转化为 B B B求最小操作次数, 设状态表示 f [ i ] [ j ] f[i][j] f[i][j]表示第一个字符串的前 i i i个字符和第二个字符串的前 j j j个字符相同的最小操作次数, 如何进行状态转移? 按照最后一步进行划分, 因为将字符串 A A A转化为 B B B有三种操作, 可以将集合划分为四类, 算法时间复杂度 O ( n 2 ) O(n ^ 2) O(n2)
代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 2010;
int f[N][N];
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
string s1, s2;
cin >> s1 >> s2;
s1 = ' ' + s1;
s2 = ' ' + s2;
memset(f, 0x3f, sizeof f);
for (int i = 0; i < s1.size(); ++i) f[i][0] = i;
for (int i = 0; i < s2.size(); ++i) f[0][i] = i;
for (int i = 1; i < s1.size(); ++i) {
for (int j = 1; j < s2.size(); ++j) {
if (s1[i] == s2[j]) f[i][j] = f[i - 1][j - 1];
else {
f[i][j] = min({
f[i - 1][j], f[i][j - 1], f[i - 1][j - 1]}) + 1;
}
}
}
cout << f[s1.size() - 1][s2.size() - 1] << "\n";
return 0;
}

京公网安备 11010502036488号