一種EDIT字母編輯器,它的功能是可以通過不同的變換操作可以把一個源串X [l..m]變換為新的目标串y[1..n]。EDIT提供的變換操作有:
源串中的單個字元可被删除(delete);
被替換 (replace);
被複制到目标串中去(copy);
字元也可被插入(insert);
源串中的兩個相鄰字元可進行交換并複制到目标串中去(twiddle);
在完成其它所有操作之後,源串中餘下的全部字尾就可用删至行末的操作删除(kill)。
例如,将源"algorithm"轉換成目标串"altruistic"的一種方法是采取下面的操作序列:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SN2QWYyQGMkdzMhZDZyYTMxYzMyEjY4EWN1kTO0I2Yh9CX5EzLcVDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL4M3Lc9CX6MHc0RHaiojIsJye.png)
要達到這個結果還可能有其它一些操作序列。
操作delete,replace,copy,insert,twiddle和kill中每一個都有一個相聯系的代價cost。例如
一個給定的操作序列的代價為序列中各操作代價之和。 例如上述操作序列的代價為
3*cost(copy)+2*cost(replace)+cost(delete)+3*cost(insert) + cost(twiddle) +cost(kill)
=3*5+2*6+3+3*4+4+1*3-1=48
程式設計任務:
給定兩個序列x[1..m],y[1..n]和一些操作代價集合,X到Y的最短距離為将X轉化為Y的最小的轉換序列的代價。請給出一個算法來找出x[1..m]至y[1..n]的最短距離。
輸入格式:
第一行:源序列x[1..m]。(m<200)
第二行:目标序列y[1..n]。(n<200)
第三行:5個正整數(<100):分别是:delete 、replace 、copy、 insert、 twiddle的代價。
輸出格式:
X到Y的最短距離(最小代價和)。
輸入樣例#1:
輸出樣例#1:
Solution:
本題線性dp。
字元串dp套路,定義狀态$f[i][j]$表示目标串比對$i$個原串操作了$j$個的最小代價,并用$w[i]$表示各操作的花費。
那麼初始狀态:$f[0][i\in 1\rightarrow n]=w[1]*i$(删除原串前$i$個字元),$f[i\in 1\rightarrow m][0]=w[4]*$(插入目标串前$i$個字元)。
那麼轉移(取$min$):
1、删除:$f[i][j]=f[i][j-1]+w[1]$。
2、替換:$f[i][j]=f[i-1][j-1]+w[2]$。
3、複制:前提$s[i]==t[j]$,則$f[i][j]=f[i-1][j-1]+w[3]$。
4、插入:$f[i][j]=f[i-1][j]+w[4]$。
5、複制交換:前提$s[i-1]==t[j]$且$s[i]==t[j-1]$,則$f[i][j]=f[i-2][j-2]+w[5]$。
最後的時候還得對目标串比對完了而原串操作到$i$位置進行字尾删除,即$f[m][i]=f[m][i]+(n-i)*w[6]-1$。
代碼: