
f[i][j]a中的前i个字母 变成 b中前j个字母的集合的操作集合将a[1~i]变成b[1~j]的操作方式操作次数最少的方案的操作数a中的第i个字母操作不同划分
a的前i个已经和b的前j-1个已经相同f[i][j] = f[i][j-1] + 1a中前i-1已经和b的前j个已经相同fi][j] = f[i-1][j] + 1fi][j] = f[i-1][j-1] + 1f[i][j] = f[i-1][j-1]min的话别忘了INFmax的话别忘了-INF1.f[0][i]如果a初始长度就是0,那么只能用插入操作让它变成b
f[i][0]同样地,如果b的长度是0,那么a只能用删除操作让它变成b
2.f[i][j] = INF //虽说这里没有用到,但是把考虑到的边界都写上还是保险

#include
#include
using namespace std;
const int N = 1010;
char a[N], b[N];
int f[N][N];
int n, m;
int main()
{
cin >> n >> (a + 1);
cin >> m >> (b + 1);
for (int i = 0; i <= m; i ++) f[0][i] = i; //字符串a长度为0,则需要将a进行i次增加操作,才能变成b
for (int i = 0; i <= n; i ++) f[i][0] = i; //字符串b长度为0,则需要将a进行i次删除操作,才能变成b
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m ; j ++)
{
f[i][j] = min(f[i - 1][j] + 1,f[i][j - 1] + 1);
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);
}
cout << f[n][m];
return 0;
}

综上:分类方式一般考虑最后一步