【例題3】這個問題直接給出了一段求函式w(a, b, c)的偽**:
def
w(a,b,c)
:if a<=
0or b<=
0or c<=0:
return
1elif a>
20or b>
20or c>20:
return w(20,
20,20)
elif areturn w(a,b,c-1)
+ w(a,b-
1,c-1)
- w(a,b-
1,c)
else
:return w(a-
1,b,c)
+w(a-
1,b-
1,c)
+w(a-
1,b,c-
1)
要求給定a, b, c,求w(a, b, c)的值。
看似**使用遞迴,但是細想的話,時間複雜度為o(3^n),計算量非常龐大。
用動態規劃思想解題,時間複雜度為o(n^3):
def
w(a,b,c)
:if a>
20or b>
20or c>20:
a, b, c =20,
20,20 db =[[
[0for k in
range
(c+1)]
for j in
range
(b+1)]
for i in
range
(a+1)]
for i in
range
(a+1):
for j in
range
(b+1):
for k in
range
(c+1):
if i*j*k ==0:
db[i]
[j][k]=1
elif adb[i]
[j][k]
= db[i]
[j][k-1]
+ db[i]
[j-1
][k-1]
- db[i]
[j-1
][k]
else
: db[i]
[j][k]
= db[i-1]
[j][k]
+ db[i-1]
[j-1
][k]
+ db[i-1]
[j][k-1]
return db[-1
][-1
][-1
]
動態規劃 記憶化搜尋
記憶化搜尋顧名思義是在搜尋的過程中通過記錄搜尋的中間狀態從而達到減少重複搜尋的方法,通常用在搜尋樹 現重複子節點的情況。例題 滑雪 給定乙個r行c列的矩陣,表示乙個矩形網格滑雪場。矩陣中第 i 行第 j 列的點表示滑雪場的第 i 行第 j 列區域的高度。乙個人從滑雪場中的某個區域內出發,每次可以向上...
記憶化搜尋例題
例題一 乘法遊戲時間限制 1sec記憶體限制 128mb題目描述乘法遊戲是在一行牌上進行的。每一張牌包括了乙個正整數。在每乙個移動中,玩家拿出一張牌,得分是用它的數字乘以它左邊和右邊的數,所以不允許拿第1張和最後1張牌。最後一次移動後,這裡只剩下兩張牌,你的目標是使得分的和最小。例如,如果數是10 ...
動態規劃之記憶化搜尋
一.動態規劃 動態規劃 dynamic programming 與 分治思想 有些相似,都是利用將問題分 為子問題,並通過合併子問題的解來獲得整個問題的解。於 分治 的不同之處在 於,對於乙個相同的子問題動態規劃演算法不會計算第二次,其實現原理是將每乙個計算過的子問題的值儲存在乙個表中。二.記憶化搜...