P2758 编辑距离(洛谷)
这道题,dp问题~
用dp[i][j]表示a中的前i个字符与b中的前j个字符转化的最少次数。
那么当a[i] == b[j]时:
dp[i][j] = dp[i - 1][j - 1]:
其余情况,要么替换要么删除要么添加。
替换:
dp[i][j] = dp[i - 1][j - 1] + 1;
删除:
dp[i][j] = dp[i - 1][j] + 1;
添加:
dp[i][j] = dp[i][j - 1] + 1;
三者选择维护一种最小的值就行。
即dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1])+ 1;
初始话部分:
dp[0][i] = i ;代表添加i个字符的最小操作次数
dp[i][0] = i;代表删除i个字符的最小操作次数
代码部分:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10;
char s1[N];
char s2[N];
int dp[N][N];
int main()
{
scanf ("%s%s", s1 + 1, s2 + 1);
int n = strlen(s1 + 1);
int m = strlen(s2 + 1);
for (int i = 1; i <= n; i++)
{
dp[i][0] = i;
}
for (int i = 1; i <= m; i++)
{
dp[0][i] = i;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (s1[i] == s2[j])
{
dp[i][j] = dp[i - 1][j - 1];
}
else
{
dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j]) + 1;
dp[i][j] = min(dp[i][j], dp[i][j - 1] + 1);
}
}
}
cout << dp[n][m] << endl;
return 0;
}