51nod編輯距離問題

2021-07-30 01:36:56 字數 1770 閱讀 4852

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

例如將kitten一字轉成sitting:

sitten (k->s)

sittin (e->i)

sitting (->g)

所以kitten和sitting的編輯距離是3。俄羅斯科學家vladimir levenshtein在2023年提出這個概念。

給出兩個字串a,b,求a和b的編輯距離。

input

第1行:字串a(a的長度 <= 1000)。

第2行:字串b(b的長度 <= 1000)。

output

輸出a和b的編輯距離

input示例

kitten

sitting

output示例

3 首先定義這樣乙個函式——edit(i, j),它表示第乙個字串的長度為i的子串到第二個字串的長度為j的子串的編輯距離。

假設字串 a, 共 m 位,從 a[1] 到 a[m]

字串 b, 共 m 位,從 b[1] 到 b[n]

d[i][j] 表示字串 a[1]-a[i] 轉換為 b[1]-b[i] 的編輯距離

那麼有如下遞迴規律(a[i] 和 b[j] 分別是字串 a 和 b 的最後一位):

當 a[i] 等於 b[j] 時,d[i][j] = d[i-1][j-1], 比如 fxy -> fay 的編輯距離等於 fx -> fa 的編輯距離

當 a[i] 不等於 b[j] 時,d[i][j] 等於如下 3 項的最小值:

d[i-1][j] + 1(刪除 a[i]), 比如 fxy -> fab 的編輯距離 = fx -> fab 的編輯距離 + 1

d[i][j-1] + 1(插入 b[j]), 比如 fxy -> fab 的編輯距離 = fxyb -> fab 的編輯距離 + 1 = fxy -> fa 的編輯距離 + 1

d[i-1][j-1] + 1(將 a[i] 替換為 b[j]), 比如 fxy -> fab 的編輯距離 = fxb -> fab 的編輯距離 + 1 = fx -> fa 的編輯距離 + 1

顯然可以有如下動態規劃公式:

if i == 0 且 j == 0,edit(i, j) = 0

if i == 0 且 j > 0,edit(i, j) = j

if i > 0 且j == 0,edit(i, j) = i

if i ≥ 1 且 j ≥ 1 ,edit(i, j) == min,當第乙個字串的第i個字元不等於第二個字串的第j個字元時,f(i, j) = 1;否則,f(i, j) = 0。

**如下:

#include

#include

#include

#include

#include

#define maxn 1004

using

namespace

std;

int ans[maxn][maxn];//注意s1表示的是列,s2表示的是行

int amongmin(int a,int b,int c)

for(i=2;i<=b+2;i++)

for(i=2;i2;i++)

for(j=2;j2;j++)

cout

<1][a+1];

}

51nod 迷宮問題

1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...

活動安排問題 51nod

原題鏈結 問題 有若干個活動,第i個開始時間和結束時間是 si,fi 同乙個教室安排的活動之間不能交疊,求要安排所有活動,最少需要幾個教室?input第一行乙個正整數n n 10000 代表活動的個數。第二行到第 n 1 行包含n個開始時間和結束時間。開始時間嚴格小於結束時間,並且時間都是非負整數,...

51nod 活動安排問題

有若干個活動,第i個開始時間和結束時間是 si,fi 只有乙個教室,活動之間不能交疊,求最多安排多少個活動?分析 我們就是想提高教室地利用率,盡可能多地安排活動。考慮容易想到的幾種貪心策略 1 開始最早的活動優先,目標是想盡早結束活動,讓出教室。然而,這個顯然不行,因為最早的活動可能很長,影響我們進...