python 動態規劃演算法

2021-10-25 07:51:40 字數 2684 閱讀 8853

你有三枚硬幣, 面值分別是a=[2,5,7] 每種硬幣足夠多,買一本書需要x=27元,如何用最少的硬幣組合正好付清,不需要對方找錢。

"""

1.確定狀態

假設最優解為k a1+a2+...+ak

1.1 最後一步:假設最優解為 27 - ak

1.2 子問題: 求27-ak最優解f(x) ---> [f[x-2] +1、 f[x-5] +1、 f[x-7] +1]

2. 轉移方程式:f(27) = min(f[25] +1, f[22] +1, f[20] +1)

3.初始條件 f(0) = 0

4.計算順序 0->27

"""def

test

(a, x)

:# 設定每個值得預設值為無窮大

f =[float

("inf"

)for i in

range

(x+1)]

# 設定初始值

f[0]

=0# 計算1到x每個值的最小步驟

for i in

range(1

, x+1)

:# 求解a中列舉的各種解決方案獲得最優解

for j in a:

if i >= j:

f[i]

=min

(f[i - j]+1

, f[i]

)print

(f[x]

)test([2

,5,7

],27)

力扣53. 給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。

示例:輸入: [-2,1,-3,4,-1,2,1,-5,4]

輸出: 6

解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。

"""

1 確定狀態:

最優解為以下標i為結束點的連續子陣列和最大

1.1 假設列表為nums, 最後乙個陣列下標為i, 最優解為函式f, 最後一步為求出最後乙個結束點的連續子陣列和最大

1.2 子問題求解f[i-1]的最優解

2 轉移方程式:

f[k] = max(a[k], f[k-1]+a[k])

3 初始條件:

f[0] = a[0]

4 計算順序

a[0] --> a[k]

"""class

solution

:def

maxsubarray

(self, nums: list[

int])-

>

int:

f =[float

("-inf"

)for _ in

range

(len

(nums))]

f[0]

= nums[0]

for i in

range(1

,len

(f))

: f[i]

=max

(nums[i]

, f[i-1]

+ nums[i]

) f.sort(

)return f[-1

]

簡化版本

class

solution

:def

maxsubarray

(self, nums: list[

int])-

>

int:

for i in

range(1

,len

(nums)):

nums[i]

=max

(nums[i]

, nums[i-1]

+ nums[i]

) nums.sort(

)return nums[-1

]

力扣300. 最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。

示例:輸入: [10,9,2,5,3,7,101,18]

輸出: 4

解釋: 最長的上公升子串行是 [2,3,7,101],它的長度是 4。

class

solution

(object):

deflengthoflis

(self, nums)

:"""

:type nums: list[int]

:rtype: int

"""ifnot

len(nums)

:return

0 dp =[1

for _ in

range

(len

(nums))]

for i in

range(1

,len

(nums)):

for j in

range

(i):

if nums[i]

> nums[j]

: dp[i]

=max

(dp[i]

, dp[j]+1

)return

max(dp)

Python 動態規劃演算法

假設你是乙個小偷,背乙個可裝4磅東西的揹包。可盜竊的商品有如下3件 音響,4磅,價值3000美元 膝上型電腦,3磅,價值2000美元 吉他,1磅,價值1500美元 為了讓盜竊的商品價值最高,你該選擇哪些商品?演算法 第9章動態規劃 w 0,4,3,1 商品的重量列表,w 0 佔位用 p 0,3000...

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...

動態規劃演算法

動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...