【TOJ 1072】編輯距離(動態規劃)
阿新 • • 發佈:2019-03-16
for 測試 一次 刪除 插入字符 替換 ring bit class
描述
假設字符串的基本操作僅為:刪除一個字符、插入一個字符和將一個字符修改成另一個字符這三種操作。
我們把進行了一次上述三種操作的任意一種操作稱為進行了一步字符基本操作。
下面我們定義兩個字符串的編輯距離:對於兩個字符串a和b,通過上述的基本操作,我們可以把a變成b或b變成a,那麽字符串a變成字符串b需要的最少基本字符操作步數稱為字符串a和字符串b的編輯距離。
例如:a="ABC",b="CBCD",則a與b的編輯距離為2。
你的任務就是:編一個快速的程序來計算任意兩個字符串的編輯距離。
輸入
輸入包含多組測試數據。每組測試數據一行,為字符串A和字符串B。
字符串的長度不大於1024,且全為字母。
輸出
編輯距離。
樣例輸入
ABC CBCD
樣例輸出
2
#include<bits/stdc++.h> using namespace std; int dp[1025][1025];//第一個串0-i和二個串0-j的編輯距離 int min(int a,int b,int c) { int min=a; if(b<min)min=b; if(c<min)min=c; return min; } int main() { string sa,sb; while(cin>>sa>>sb) { int i,j; for(i=0;i<=sa.size();i++)dp[i][0]=i; for(j=0;j<=sb.size();j++)dp[0][j]=j; //計算替換操作的代價,如果兩個字符相同,則替換操作代價為0,否則為1 //dp[i-1,j] +1 //在sa上i位置刪除字符(或者在sb上j-1位置插入字符) //dp[i,j-1] +1 //在sa上i-1位置插入字符(或者在sb上j位置刪除字符)//dp[i-1,j-1]+1 //替換操作 for(i=1;i<=sa.size();i++) { for(j=1;j<=sb.size();j++) { if(sa[i-1]==sb[j-1]) dp[i][j]=min(dp[i-1][j-1],dp[i-1][j]+1,dp[i][j-1]+1); else dp[i][j]=min(dp[i-1][j-1]+1,dp[i-1][j]+1,dp[i][j-1]+1); } } printf("%d\n",dp[sa.size()][sb.size()]); } return 0; }
【TOJ 1072】編輯距離(動態規劃)