設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 將乙個字元改為另乙個字元。...