思路
设dp[i][j]表示X[i]与Y[j]的编辑距离.
那么,可以进行三种操作:
插入x[i](等同于删除y[j]),那么dp[i][j]就等于dp[i-1][j]+1. 插入x[i](等同于删除y[j]),那么dp[i][j]就等于dp[i-1][j]+1. 将x[i]替换成y.运用贪心,得到状态转移方程为:
dp[i][j]=min{dp[i-1][j]+1,dp[i-1][j]+1,dp[i-1][j-1]+(x[i]!=y[j])}
剩下的就是混代码了,不再赘述。
Code
#include#include using namespace std;string A,B;int dp[2001][2001];int min(int a,int b,int c){ if(a<=b&&a<=c) return a; if(b<=a&&b<=c) return b; if(c<=a&&c<=b) return c;}int main(){ //freopen("testdata.in","r",stdin); cin>>A>>B; for(int i=1;i<=A.size();i++) { dp[i][0]=i; } for(int j=1;j<=B.size();j++) { dp[0][j]=j; } for(int i=1;i<=A.size();i++) { for(int j=1;j<=B.size();j++) { dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+(A[i-1]!=B[j-1])); } } /* 生成DP表格以便调试 cout<<" "< <