1. 程式人生 > >POJ 1651 Multiplication Puzzle 動態規劃及搜尋

POJ 1651 Multiplication Puzzle 動態規劃及搜尋

這是一道比較簡單的DP,通過分析可以設最後拿走的牌為i,則所求的最優解就是i左邊和右邊子列的最小連乘積再加上x[a]*x[i]*x[b],因為i將原來的序列劃分為兩個子列,這兩個子列符合“最優子結構”和“重疊子問題”的dp特點,他們的最優解互相之間沒有影響,只會影響全域性問題的最優解,在POJ discuss中的解析比較經典,摘錄如下,以後做題可以常常看看discuss,就當學習,但是還是要獨立思考為主

對於整個牌的序列,最左端和最右端的牌是不能被取走的,除這兩張以外的所有牌 > ,必然有一張最後取走。取走這最後一張牌有一個僅與它本身以及最左端和最右端的 > 牌的值有關的得分,這個分值與其他牌沒有任何關係。當這張最後被取走的牌被定 > 下來以後(假設位置為j), 最左端到j之間的所有牌被取走時所造成的得分必然只與 > 這之間的牌有關從而與j到最右端之間的牌獨立開來。這樣就構成了兩個獨立的子 > 區間,出現重疊子問題。於是問題的解就是 > 取走最後一張牌的得分+兩個子區間上的最小得分 > 不妨假設當前區間為[b, e],在(b,e)之間列舉最後一張被取走的牌,通過最優子問題 > 求出當前區間的最優解: > opt[b][e] = min{ opt[b][j]+opt[j][e] + val(b,j,e); }; > b+1<= j <=e-1 > val(b,j,e)是取走j所造成的得分,即第b,j,e這三張牌的積。 > 空間o(n^2), 時間o(n^3)

演算法實現

dp[i][j] 表示把第 i 個數字到第 j 個數字之間(不包括i,j)的數字去光後得到的最小值。
設 x[i] 是第 i 個數字的值。
dp[i][j] = min(dp[i][k] + dp[k][j] + x[i] * x[k] * x[j]),i + 1 <= k <= j - 1
所有連續的兩個數已經符合要求,即dp[i][i + 1] = 0

 

另外在網上看到有人用dfs搜尋解決,摘錄如下:http://blog.csdn.net/sushizhuyilang/archive/2010/08/26/5839324.aspx