动态规划:
1.状态表示:f[i][j]表示为将a[1~i]包括的所有元素变为b[1-i]所包括的元素操作方式的次数。属性为min。
2.状态计算包括删,添,改三个操作。
#include<iostream>
#include<algorithm>
const int N=1010;
int f[N][N];//表示将a[1~i]包括的所有元素变为b[1-i]所包括的元素操作方式的次数的最小值
char a[N],b[N];
int n,m;
using namespace std;
int main()
{
cin>>n>>a+1>>m>>b+1;
for(int i=1;i<=m;i++) f[0][i]=i;//初始化将一个空字符串变为b[1-i]的操作次数,简单来说就是有多少个b数组的字符,就要进行添加操作几次才能变为b[i]。
for(int i=1;i<=n;i++) f[i][0]=i;//初始化将a[1-i]的字符串变为空字符串需要有i次删除操纵。
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);//首先在删操作与添操作中取一个min。
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]<<endl;
return 0;
}