$dp$做法:
$f[i][j]$为使得 $a$ 串的前 $i$ 个字符包含 $b$ 串的前 $j$ 个字符的最小操作次数
$f[i][j]$可以怎么转移而来呢
首先,$a$ 串的第 $i$ 个字符如果不用的话,就是 $f[i - 1][j]$
然后用的话,
如果 $a[i] == b[j]$,就是可以 $a[i]$ 与 $b[j]$ 匹配上,可以由 $f[i - 1][j - 1]$ 转移
如果 $a[i] != b[j]$,那就改变 $a[i]$ 变为 $b[j]$,让他们匹配上,就由 $f[i - 1][j - 1] + 1$ 转移了
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1010;
char a[N], b[N];
int f[N][N]; // f[i][j]为使得a串的前i个字符包含b串的前j个字符的最小操作次数
int main()
{
scanf("%s%s", a + 1, b + 1);
int n = strlen(a + 1), m = strlen(b + 1);
memset(f, 0x3f, sizeof f);
f[0][0] = 0;
for(int i = 1; i <= n; i ++)
{
f[i][0] = 0;
for(int j = 1; j <= m; j ++)
{
f[i][j] = f[i - 1][j];
if(a[i] == b[j]) f[i][j] = min(f[i][j], f[i - 1][j - 1]);
else f[i][j] = min(f[i][j], f[i - 1][j - 1] + 1);
}
}
printf("%d\n", f[n][m]);
return 0;
}