看到一句话笑死,哈哈哈。
你的酒窝没有酒,我却醉得像条狗。
#include<iostream>
#include<algorithm>using namespace std;const int N=1010;
int n,m;
char a[N],b[N];
int f[N][N];int main(){scanf("%d%s",&n,a+1);scanf("%d%s",&m,b+1);for(int i=0;i<=n;i++){f[i][0]=i;}for(int i=0;i<=m;i++){f[0][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);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;
}
这题还是挺多细节需要考虑的。首先,输入的是字符数组。第二,输入之后要把我们的答案数组初始化。表示的意思就是假设原来的数组是空的,那么最少需要若干步才能变成什么样,其实就是用新增的操作。然后假设原来的数组不是空的,但是目标是空的,那么需要把我们的所有元素删除。
第三,我们分为三种情况来考虑。删除,增加,修改。有点像数据库的增删改查。好像每一步都有。最后的输出就是查。哈哈哈。删除的话,就是 a
的前面 i-1
和 b
的前面 j
个元素都是相等的。进行一步删除操作就可以。新增是 a
的前面 i
个元素和 b
的前面 j-1
个元素相等,新增一个元素,进行一步操作即可。状态转移就是这样。
修改的时候,我们要看是否需要修改,假设需要修改就增加一次操作次数,不需要修改就继承上一次的操作次数。
以上。