原題傳送門
本身動手敲的第一道二維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; }