日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划法(九)想要更多例子?

發布時間:2025/3/8 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划法(九)想要更多例子? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??本文將會介紹三個用動態規劃法解決的例子,分別是:

  • 樓梯臺階問題
  • 二項式系數求解
  • 最大乘積子數組問題

樓梯臺階問題

一個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_{n}^{k}=C_{n-1}^{k}+C_{n-1}^{k-1}.$$
再結合$C_{n}^{0}=1,C_{n}^{1}=n$對該問題用動態規劃法進行求解,本質上這也是一個遞歸關系式。Python代碼如下:

import numpy as npdef binomial(n, k):if k == 0:return 1elif k == 1:return nelse:table = np.array([[0] * (k + 1)] * n, dtype='int64')for i in range(n):table[i, 0] = 1table[i, 1] = i + 1for i in range(n):for j in range(2, k+1):if i+1 < j:table[i, j] = 0else: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_indexsum = arr[end_index]while abs(sum- max(MS)) > pow(10, -5):begin_index -= 1sum += 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]。

注意:本人現已開通兩個微信公眾號: 用Python做數學(微信號為:python_math)以及輕松學會Python爬蟲(微信號為:easy_web_scrape), 歡迎大家關注哦~~

總結

以上是生活随笔為你收集整理的动态规划法(九)想要更多例子?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。