51Nod 1183 編輯距離

2021-08-18 13:16:26 字數 1087 閱讀 4465

題意:編輯距離,又稱levenshtein距離(也叫做edit distance),是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。給出兩個字串a,b,求a和b的編輯距離。

題解:面對這道題的第一思路是用最長公共子串行去寫。用兩個字串中較長的減去最長公共子串行,然後發下wa了。後來仔細想了一下推出了一組反例

abcde

bcdef

上面那種錯誤解法為 5 - 4 =  1

但是實際上應該是2(去掉a然後加個f).

那麼換一種想法。這道題要求把a變成b的最少運算元。

然麼我們不妨定義dp【i】【j】 表示a串前 i 個字元轉化成b串前 j 個字元最小需要到少次。

那麼dp【alen】【blen】就是我們要求的結果。

思考dp方程如何去寫。

我們有三種操作,

增:這是當a串長度小於b串時。

改:這是a【i】!= b【j】;

刪:刪去a【i】 或 b【j】;

當 a【i】 != b【j】時

很明顯dp【i】【j】 = dp【i-1】【j-1】 + 1;

相等時dp【i】【j】 = dp【i-1】【j-1】+ 0;

再思考,dp【i】【j】還可以從**轉移過來,

就是從刪這一步

有兩種dp【i】【j】 = min(dp【i-1】【j】 + 1 , dp【i】【j-1】+ 1)

然後比較上述兩個式子。

#include#include#include#includeusing namespace std;

const int maxn = 1e3+5;

char a[maxn], b[maxn];

int dp[maxn][maxn];

int main()

}// for(int i = 0 ; i <= alen ; i ++)

// cout << endl;

// }

printf("%d\n", dp[alen][blen]);

return 0;

}

51nod 1183 編輯距離

基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 編輯距離,又稱levenshtein距離 也叫做edit distance 是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。例如將kitte...

51 nod 1183 編輯距離

1183 編輯距離 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 編輯距離,又稱levenshtein距離 也叫做edit distance 是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字...

51nod 1183 編輯距離

思路 之前做個這道題,當時就感覺此題很像最長公共子串行,今天重新做51nod裡想了一次,思路是相同的,一開始初始陣列,最長公共子串行是0到n有多少個相同 這個是0到n需要轉化多少步 那自然也就是n步了 按著這個思路 a b 的a陣列前i個與b陣列前j個需要幾步轉化,相同思路,模擬 include i...