一,問題描述
有個小孩上樓梯,共有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;一次性爬三層。
三,**實現
publicclass
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,思考一下,你還能寫出幾種 ...