乙個n階的樓梯,乙個嬰兒每次爬一階或兩階,試問一共有多少種辦法爬完樓梯。設f(n)為該問題的解,考慮最後一次的爬法,若最後一次爬一階,則前面n-1階樓梯有f(n-1)種辦法,若最後一次爬兩階,則前面n-2階樓梯有f(n-2)種辦法,因此:
\[f(n)=f(n-1)+f(n-2).
\]f(1)=1,f(2)=2,f(3)=3,....該數列為斐波那契數列,可以參考部落格動態規劃法(一)從斐波那契數列談起用動態規劃法進行求解。
乙個n階的樓梯,乙個嬰兒每次爬一階或兩階或三階台階,試問一共有多少種辦法爬完樓梯。同上面的解法一樣,有:
\[f(n)=f(n-1)+f(n-2)+f(n-3).
\]其中,f(1)=1,f(2)=2,f(3)=4. 可以參考部落格動態規劃法(二)找零錢問題用動態規劃法進行求解。
對於二項式係數,有如下等式:
\[c_^=c_^+c_^.
\]再結合\(c_^=1,c_^=n\)對該問題用動態規劃法進行求解,本質上這也是乙個遞迴關係式。python**如下:
import numpy as np
def binomial(n, k):
if k == 0:
return 1
elif k == 1:
return n
else:
table = np.array([[0] * (k + 1)] * n, dtype='int64')
for i in range(n):
table[i, 0] = 1
table[i, 1] = i + 1
for i in range(n):
for j in range(2, k+1):
if i+1 < j:
table[i, j] = 0
else:
table[i, j] = table[i-1, j] + table[i-1, j-1]
return table[n-1, k]
t = binomial(50, 10)
print(t)
所謂的最大乘積子陣列問題,指的是:給定乙個陣列a,尋找a的乘積最大的非空連續子陣列。比如,陣列 a = [-2, -3, 4], 最大乘積子陣列應為a,其乘積為24。
在部落格動態規劃法(八)最大子陣列問題(maximum subarray problem)中,我們已經用動態規劃法解決了最大子陣列問題。對於最大乘積子陣列問題,我們也可以類似地用動態規劃法解決。但是,對於a中元素均為正數的情形,可以有更簡單的方法。
首先對a中元素去對數,則原問題等價於最大子陣列問題,找出最大和後,再用指數作用,就能得到a中元素均為正數的最大乘積子陣列問題的解。其python**如下:
from math import log2, pow
# using dynamic programming to slove maximum subarray problem
def dp_maximum_subarray(old_arr):
# 對原陣列取底為2的對數
arr = [log2(x) for x in old_arr]
# 對新陣列求解最大子陣列問題
# 並求出該子陣列的開始座標(begin_index)和結束座標(end_index)
t = len(arr)
ms = [0]*t # 初始化ms陣列
ms[0] = arr[0] # 動態規劃法的初始值
# 動態規劃法的子結構
for i in range(1, t):
ms[i] = max(ms[i-1]+arr[i], arr[i])
# 求解該子陣列的開始座標(begin_index)和結束座標(end_index)
end_index = ms.index(max(ms))
begin_index = end_index
sum = arr[end_index]
while abs(sum- max(ms)) > pow(10, -5):
begin_index -= 1
sum += arr[begin_index]
return begin_index, end_index, pow(2, max(ms))
a = [1/2, 4, 1/2, 16, 1/8, 32, 2, 1/16]
begin_index, end_index, max_product = dp_maximum_subarray(a)
print([begin_index, end_index, max_product])
輸出結果為:
[1, 6, 256.0]
最大乘積子陣列問題的最大乘積為256,子陣列開始座標為1,結束座標為6,因此子陣列為[4, 1/2, 16, 1/8, 32, 2]。 動態規劃法
在學習動態規劃法之前,我們先來了解動態規劃的幾個概念 1 階段 把問題分成幾個相互聯絡的有順序的幾個環節,這些環節即稱為階段。2 狀態 某一階段的出發位置稱為狀態。3 決策 從某階段的乙個狀態演變到下乙個階段某狀態的選擇。4 狀態轉移方程 前一階段的終點就是後一階段的起點,前一階段的決策選擇匯出了後...
動態規劃法
有些問題在分解時會產生許多子問題,且分解出的自問題互相交織,因而在解這類問題時,將可能重複多次解乙個子問題。這種重複當然是不必要的,解決方法可以在解決每個子問題後把它的解 包括其子子問題的解 保留在乙個 中,若遇到求與之相同的子問題時,dp演算法又稱動態規劃,是資訊學競賽中選手必須熟練掌握的一種演算...
動態規劃法
最近遇到了一道挺有意思的演算法題 四種硬幣 1元3元4元5元 問 想要湊成n元錢最少幾枚硬幣?public class coinsgamemain fun 7,is public static void fun int k,int is i1 l min i2 if l k private stat...