編輯距離 DP

2021-10-10 14:26:46 字數 1643 閱讀 3031

設a

aa和b

bb是兩個字串。我們要用最少的代價(或者字元操作次數),將字串a

aa轉換為字串b

bb。字元操作有三種

1.插入乙個字元,所需代價為x

xx2.刪除乙個字元,所需代價為y

yy3.將乙個字元改為另乙個字元,即替換,所需代價為z

zz輸入abab

ab兩個字串,輸出代價

刪除:可以看做把a

aa串最後乙個字元刪去後不再考慮這個字元 所以dp[

i][j

]=mi

n(dp

[i][

j],d

p[i−

1][j

]+x)

dp[i][j]=min(dp[i][j],dp[i-1][j]+x)

dp[i][

j]=m

in(d

p[i]

[j],

dp[i

−1][

j]+x

)插入:可以看做與b

bb串最後乙個字元抵消後不再考慮這個字元 所以dp[

i][j

]=mi

n(dp

[i][

j],d

p[i]

[j−1

]+y)

dp[i][j]=min(dp[i][j],dp[i][j-1]+y)

dp[i][

j]=m

in(d

p[i]

[j],

dp[i

][j−

1]+y

)替換:可以看做刪和加的集合 抵消了abab

ab串最後的兩個字元 所以dp[

i][j

]=mi

n(dp

[i][

j],d

p[i−

1][j

−1])

dp[i][j]=min(dp[i][j],dp[i-1][j-1])

dp[i][

j]=m

in(d

p[i]

[j],

dp[i

−1][

j−1]

)

ll n,m,p;

char s[maxn]

,t[maxn]

;ll dp[maxn]

[maxn]

;//將s換為t所需要的最少次數

intmain()

for(

int i=

1;i<=n;i++

)//將s[1...i]經過最少次數的操作轉化為t[1...j]

//在此之前以最小次數k的操作,使得現在的s,t只需再做一次操作或者不做操作

// 就可以使s[1...i]轉換到t[1...j],有三種情況

//s[1...i]轉換為t[1...j-1] 新增

//s[1...i-1]轉換為t[1...j] 刪除

//s[1...i-1]轉換為t[1...j-1] 替換

for(

int i=

1;i<=n;i++

)else}}

printf

("%lld\n"

,dp[n]

[m])

;}

編輯距離 (dp)

編輯距離,又稱levenshtein距離 也叫做edit distance 是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。例如將kitten一字轉成sitting sitten k s sittin e i sit...

DP 編輯距離

2019 02 27 題目及 更新 設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。對任意的兩個字串a和b,計算出將字串a變換為字串b所用的最少字元操作次數。第一行為字串a 第二行為字...

DP 編輯距離

日常吐槽 關於dp,有一種莫名的恐懼.maybe源於與mtw大佬與quantum11大佬,初中時抬老師爬樓梯的經歷。言歸正傳 題目描述 設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。...