動態規劃:青蛙跳臺階、變態跳臺階
阿新 • • 發佈:2019-02-07
青蛙跳臺階問題是一個簡單的動態規劃問題。
問題1:普通跳臺階
一隻青蛙可以一次跳 1 級臺階或者一次跳 2 級臺階,例如:
- 跳上第 1 級臺階只有一種跳法:直接跳 1 級即可。
- 跳上第 2 級臺階有兩種跳法:每次跳 1 級,跳兩次;或者一次跳 2 級。
問要跳上第
很多人喜歡正向思考,使用暴力求解,但往往這是一個很複雜的問題。我們可以反過來思考:
如果我們要跳上第
我們令 (n)
是不是很熟悉,它不就是斐波那契數列嗎,程式碼就很簡單啦:
int jumpFloor(int number) {
int g = 1, f = 2;
while (number-- > 1) {
f += g;
g = f - g;
}
return g;
}
問題2:變態跳臺階
變態跳臺階問題是這樣的:如果青蛙可以一次跳 1 級,也可以一次跳 2 級,一次跳 3 級,…,一次跳
同樣的,我們採用逆向思維,將問題改為:跳上第
要跳上第
同時,
所以,由上面兩個公式可知:
即:
因為
程式碼如下:
int square(int a) { return a * a; }
int power2(int n) { // 計算2的n次方
if (0 == n) return 1;
return n % 2 ? square(power2(n>>1))<<1 : square(power2(n>>1));
}
int jumpFloorII(int number) {
return power2(number - 1);
}