動態規劃法(九)想要更多例子?

2022-07-01 20:12:10 字數 2468 閱讀 8429

乙個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...