Rod Cutting
有一段長的鋼管,根據市場需求,鋼管可以切成1m,2m,3m,4m出售,每種尺寸的鋼管價格不同,如果有一段10m長的鋼管,如何切割可以使利益最大化呢?如下圖所示:
我們可以想到用分治的辦法解決,例如,切一刀,遞歸去找余下長度的最優,切兩刀,遞歸去找余下長度的最優,一次類推,這是一個指數級增長的計算量。
上述不是一個好辦法,怎么優化呢?我們可以依次去找切成1塊的最優、兩塊的最優、三塊最優,以此類推,并將此記錄下來,如下表所示。然后在求余下的最優,看記錄表有沒有此長度的記錄,有的話直接獲取,沒有的話在去計算。
長度 | 最優切割方式 | 價值 |
---|---|---|
1 | 不切 | 1 |
2 | 不切 | 5 |
3 | 不切 | 8 |
... | ... | ... |
Sequence Matching
在生物學中,人類DNA由4個堿基組成:腺嘌呤(A),胸腺嘧啶(T),鳥嘌呤(G),胞嘧啶(C)。如果想判斷兩段DNA相似程度,可以通過編輯距離(edit distance)來判定,即一個字符串通過刪除、修改轉變為另外一個字符串,已知每種操作的成本如下:
上圖中左邊的編輯距離是8,右邊的是7.
在每次匹配中,我們都可以執行兩種操作:1.當前字符匹配(相等成本為0,修改為1);2.刪除其中一個字符(成本為2)。參考如下示例:
在解決此問題中,因為每次匹配都會涉及到重復的計算,我們可以把已匹配的結果,存儲下來方便復用。比如上圖中,我們知道了兩字符串后兩位的最優編輯距離是1,并且知道了其他操作的編輯距離,方便后面復用。
我們將兩個字符串變成了2維矩陣,中間的每一個格代表兩字符串的編輯距離(從后向前)。比如“CC”和“A”的編輯距離是3,即C和A進行修改成本為1,刪除最后的C成本為2. 再比如“AACAGTTACC”和“”編輯距離是20,即進行了10次刪除操作,變為空串。計算公式如下:
上述公式表明匹配到當前字符串S1[i: ]和S2[j: ]時,可以刪除某一字符串的字符(成本為2)然后加上已經計算過的兩字符串的編輯距離;或當前字符進行匹配(成本:相同為0,修改為1)然后加上已經計算過的兩字符串的編輯距離。
兩字符串完整的編輯距離如下圖所示,我們可以找到最優的匹配方式:首先是A和T匹配,然后是A和A匹配,然后刪除掉行字符串的C,然后A和A匹配,依次類推。