原题传送门
本身动手敲的第一道二维DP题目(尽管偷偷翻了一下算法书),心情很美丽。ios
设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]替换成yj.spa
运用贪心,获得状态转移方程为:调试
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<iostream> #include<string> 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<<" "<<B<<endl; for(int i1=1;i1<=A.size();i1++) { cout<<A[i1-1]; for(int j1=1;j1<=B.size();j1++) { cout<<dp[i1][j1]; } cout<<endl; } cout<<endl; */ cout<<dp[A.size()][B.size()]; return 0; }