//1、状态以及状态转移 -> 定义 //2、子问题的解 -> 全局问题的解 //3、包含所有可能操作 的最优结果 //4、本质上是一种递推 #include #include #include #include using namespace std; int minEditDistance(const string& a, const string& b) { int m = a.size(), n = b.size(); // dp[i][j]表示A[0:i]到B[0:j]的最小操作次数 vector> dp(m + 1, vector(n + 1, 0)); // 初始化边界 for (int i = 0; i <= m; ++i) dp[i][0] = i; // 删除i个字符 for (int j = 0; j <= n; ++j) dp[0][j] = j; // 插入j个字符 // 状态转移 for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { if (a[i-1] == b[j-1]) { dp[i][j] = dp[i-1][j-1]; // 匹配,无需操作 } else { dp[i][j] = min({dp[i-1][j-1], dp[i-1][j], dp[i][j-1]}) + 1; // 替换、删除、插入 } } } return dp[m][n]; } int main() { string a, b; getline(cin, a); // 读入字符串A getline(cin, b); // 读入字符串B cout << minEditDistance(a, b) << endl; // 输出结果 return 0; }