Python 經典演算法題

2021-10-01 18:29:40 字數 1645 閱讀 7048

概念:動態規劃過程是:每次決策依賴於當前狀態,又隨即引起狀態的轉移。乙個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。

演算法關鍵點:

1、最優化原理,也就是最有子結構性質。這指的是乙個最優化策略具有這樣的性質,無論過去狀態和決策如何,對前面的決策所形成的狀態而言,餘下的決策必須構成最優策略,簡單來說就是乙個最優化策略的子策略總是最優的,如果乙個問題滿足最優化原理,就稱其有最優子結構性質。

2、無後效性,指的是某個狀態下的決策的收益,只與狀態和決策相關,與達到該狀態的方式無關。

3、子問題的重疊性,動態規劃將原來指數級的暴力搜尋演算法改進到了具有多項式時間複雜度的演算法,其中的關鍵在於解決了榮譽,重複計算的問題,這是動態規劃演算法的根本目的。

4、總體來說,動態規劃演算法就是一系列以空間換取時間的演算法。

典型示例:

例1:一組二維陣列[[10,3,1,13],[8,11,3,4],[5,0,2,1],[1,8,4,0]],從座標0,0開始移動,每次只能向下或者向右移動一格,最優路徑是經過路徑的所有陣列值之和,最小即為最優路徑,求最優路徑大小。

a = [[10,3,1,13],[8,11,3,4],[5,0,2,1],[1,8,4,0]]  #一組二重陣列

b = [[0,0,0,0]]*4 #用來裝路徑值結果

print(a)

print(b)

for i in range(4):

for j in range(4):

if i==0 and j==0 :

b[i][i] = a[i][j]

elif i==0 and j!=0:

b[i][j] = a[i][j] +b[i][j-1]

elif i!=0 and j==0:

b[i][j] = a [i][j] + b[i-1][j]

else:

b[i][j] = a[i][j] +min(b[i][j-1],b[i-1][j])

print("最優路徑:%d" %b[3][3])

例2:有n級台階,現在從第一級開始爬,一次可以爬一級,也可以一次爬2級,請問爬到第n級一共有多少種方法?

分析:當台階只有1級,有1種;2級,有2種;3級,有3種,,,當要爬到n級的時候,此時有2種情況,一種是跨1級,另一種是跨2級才能到第n級。到達n級的情況則是這兩種之和,依次往前推,則有公式f(n) = f(n-1) +f(n-2)

a = [0] * 10

def fun(self,scale):

if scale ==1 or scale==2:

return scale

if a[scale-1] ==0:

a[scale-1] = self.fun(scale-1)

if a[scale-2] == 0:

a[scale - 2] = self.fun(scale-2)

return a[scale - 1] + a[scale - 2]

未完。。。

經典演算法題

題目 古典問題 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第四個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?1.程式分析 兔子的規律為數列1,1,2,3,5,8,13,21 分析 首先這個你得找規律,這個剛開始的時候不要太心急。不難看出有個很好的式子 從第三個...

python面試經典題 Python經典面試題

1 邏輯運算子的運算 and or not 優先順序,not and or print not 2 1 and 3 4 or 4 5 and 2 1 and 9 8 or 7 6 f x or y x true,則返回x print 1 or 2 1 print 3 or 2 3 print 0 o...

PHP經典演算法題

面試題 演算法題 1 插入排序 一維陣列 基本思想 每次將乙個待排序的資料元素,插入到前面已經排好序的數列中的適當位置,使數列依然有序 直到待排序資料元素全部插入完為止。示例 初始關鍵字 49 38 65 97 76 13 27 49 j 2 38 38 49 65 97 76 13 27 49 j...