1. 程式人生 > >動態規劃優化過程

動態規劃優化過程

ash put 動態規劃 class 一次 int 遞歸 col AI

題目:走10層樓梯,每步只能走1或2步

1:
將每次的進行排列組合:2的10次冪

2:

最後差一步到第10層的有幾種情況?從9到10或從8到10,2種情況
這樣假設0到9走法有X種,0到8走法是Y種,0到10有X+Y,因為最後一次是固定的。

問題建模:
F(10) = F(9) + F(8), 同理 F(9) = F(7) + F(8)
邊界:F(1)= 1; F(2)= 2;
最優子結構,狀態轉移:F(n) = F(n-1) + F(n-2) (n>=3)

求解問題:

//時間復雜度O(2^n)
//遞歸:
int getclimbWays(int n){
    if (n < 1) {return 0}
    
if (n == 1) {return 1} if (n == 2) {return 2} return getclimbWays(n -1) + getclimbWays(n -2); }

1)優化時間復雜度

//建立哈希表:備忘錄算法
//時間復雜度:n, 空間復雜度:n
int getclimbWays(int n, HashMap<Integer, Integer> map){
    if (n < 1) {return 0}
    if (n == 1) {return 1}
    if (n == 2) {return 2}
    if (map.contains(n)){
        
return map.get(n); }else{ int value = getclimbWays(n -1) + getclimbWays(n -2); map.put(n, value); return value; } }

2)優化空間復雜度,自底向上求解,只要保留2個狀態

// 動態規劃
int getclimbWays(int n, HashMap<Integer, Integer> map){
    if (n < 1) {return 0}
    if (n == 1
) {return 1} if (n == 2) {return 2} int a = 1; int b = 2; int temp = 0; for(int i = 3; i <= n; i++){ temp = a + b; a = b; b = temp; } return temp; }

動態規劃優化過程