動態規劃之Fib數列類問題應用

2021-09-07 06:53:24 字數 1081 閱讀 4381

一,問題描述

有個小孩上樓梯,共有n階樓梯,小孩一次可以上1階,2階或者3階。走到n階樓梯,一共有多少種走法?

二,問題分析

dp之自頂向下分析方式:

爬到第n階樓梯,一共只有三種情況(全劃分,加法原理),從第n-1階爬1階到第n階;從第n-2階爬2階到第n階;從第n-3爬3階到第n階

故:way(n)=way(n-1)+way(n-2)+way(n-3)

這與求fib數列非常相似,當然,其他類似的問題也可以這樣求解。

初始條件:

way(1)=1

way(2)=2

way(3)=4

這裡解釋一下way(3)=4。爬到第3層一共有4種方式:每次爬一層,1+1+1=3;先爬一層,再爬二層,1+2=3;先爬二層,再爬一層,2+1=3;一次性爬三層。 

三,**實現

public

class

waysofladder

//遞迴演算法爬上第n階樓梯一共需要多少種方式

private

static

int waysladder(int

n)

//dp

public

static

int ways_dp(int

n)

return

res;

}public

static

void

main(string args)

}

上面**清晰地對比了dp實現與遞迴實現的方式。dp是用三個變數儲存當前計算的結果,當計算下乙個結果時,先「查表」再計算。而遞迴則是使用三個遞迴函式呼叫,遞迴函式呼叫計算了大量的重疊的子問題,每次遞迴呼叫都要壓棧、出棧。遞迴的時間複雜度為o(3^n),而dp的時間複雜度為o(n)

類似的思想,還有計算楊輝三角的公式:c(n,r)=c(n-1,r) + c(n-1,r-1)

只不過楊輝三角的計算公式有兩個引數而已。

另外,相關問題可參考:組合問題與動態規劃的聯絡之應用

組合問題與動態規劃的聯絡之應用

一,問題描述 假設有個機械人坐在 x y 網格的最左上角,每次只能向下或者向左移動。最左上角的座標標記為 0,0 最右下角的座標為 x,y 請問 機械人從 0,0 走到 x,y 共有多少種走法?其實這個問題與 這篇文章 中提到的問題非常相似。二,問題分析 這個問題一共有三種方式來求解。第一種是使用公...

動態規劃之投資問題

1 問題描述 有m元錢,n項投資,f i x 代表將x元投入到第i個專案中的收益,求最大的收益。2 輸入 第一行為總錢數m和總專案數n 接下來為n行輸入,每行m個,代表f i x 3 輸出 最大收益 4 解析 動態規劃問題一般分為兩類 中間狀態類和累積狀態類。前者的引數是相同的,後者的引數不同,而且...

動態規劃之台階問題

有一座高度是 10級台階的樓梯,從下往上走,每跨一步只能向上 1級或者 2級台階。要求用程式來求出一共有多少種走法。如果每次走 1級,需要走 10步,結果可以表示成 1,1,1,1,1,1,1,1,1,1 如果每次走 2級,需要走 5步,結果可以表示成 2,2,2,2,2,思考一下,你還能寫出幾種 ...