題目描述:
現有字串a,b,要使得a=b,有如下三
種操作:
將a刪除1個字元;
將a插入1個字元;
將a中的乙個字元改為另乙個字元;
樣例輸入:
sfdqxbw
gfdgw
樣例輸出: 4
解釋:
sfdqxbw->gfdqxbw->gfdxbw->gfdbw->gfdgw,四步。
這道題因為只能操作a,就能有效避免動態規劃的無後效性,就是a的操作並不會影響接下來的操作,但如果可以操作b則就會影響a的操作了。
我們可以按i,j的長度來劃分階段,狀態只要稍微想一想都知道是設f[i,j]表達a
1..i
~b1..j
的最優編輯距離。
同樣這道題的邊界也極為重要,f[0,i]以及f[i,0]的值都為i(1<=i<=lena,lenb)
那方程又是什麼呢?
其實,操作的三種情況都對應了三個不同的決策——
當i,j不相同時,有如下三種操作
第一種操作:f[i-1,j]+1
第二種操作:f[i,j-1]+1
第三種操作:f[i-1,j-1]+1
而當相同時則f[i,j]直接等於f[i-1,j-1]。
**:var
i,j,k,m,n:longint;
s1,s2:ansistring;
f:array[0..2000,0..2000] of longint;
function min(x,y:longint):longint;
begin
if x
低價購買(動規例題)
求乙個最長不下降子串行,以及這個最長不下降子串行在這個序列裡的個數 不能重複 對於第一問我們就只要普通的dp一下就行了,以下將最長不下降子串行稱為最長序列 對於第二問這裡要詳細的講一下。狀態有如下 f i 表示到第i個數的最長序列 b i 表示到第i個數的最長序列的個數 很容易得出方程 f i ma...
初學動規 例題 滑雪
本人是根據mooc大學郭煒老師得程式設計與演算法進行的個人總結 一般思路 1 把原問題轉化為若干的子問題,子問題和原問題形式相同或類似,只是規模變小了。子問題的解一旦求出 就把他儲存下來,如果再遇到就可以直接使用無需再進行計算。3 確定初始狀態 邊界狀態 的值 4 狀態轉移方程。從乙個或多個值已知狀...
方格取數(動規例題)
對於n n的乙個矩陣中有著許多數字,規定你從左上角出發,走到右下角,走兩遍,每一次走時可以取矩陣中的數字,求如何取得最大的和。這道題可以四重迴圈列舉兩條路所走到的位置。然後判斷i,j點,h,k點是由上或左得來最大值,sum i,j,h,k 表示第一條道路走到i,j點,第二條走到h,k點時的最優值,顯...