變態跳臺階
題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
分析
參考:https://www.nowcoder.com/questionTerminal/22243d016f6b47f2a6928b4313c85387?answerType=1&f=discussion
dp 就是可以由什麼狀態推導出最後的狀態,斐波那契數列是由前兩種狀態,而這裏就是由前 n - 1 種狀態推導出
這裏用同一個套路來分析一下
-
若樓梯階級 n = 3
- 跳 3 步到 3:沒有剩下步數沒跳的,只有這樣一種跳法
- 跳 2 步到 3:剩下的是第一步沒跳,起始跳到第一步只有一種
- 跳 1 步到 3:剩下的是第二步沒跳,起始跳到第二步有兩種
求得,n = 3 時,有 4 種跳法
-
若樓梯階級 n = 4
- 跳 4 步到 4:沒有剩下步數沒跳的,只有這樣一種跳法
- 跳 3 步到 4:剩下的是第一步沒跳,起始跳到第一步只有一種
- 跳 2 步到 4:剩下的是第二步沒跳,起始跳到第二步只有兩種
- 跳 1 步到 4:剩下的是第三步沒跳,起始跳到第三步有四種
求得,n = 4 時,有 8 種跳法
-
若樓梯階級 n = n
- 跳 x 步到 n 有幾種的和,跟前 n - 1 種狀態有關
易知 f(n)=f(n-1)+f(n-2)+……f(1),f(n-1)=f(n-2)+……f(1),兩式相減得f(n)=2f(n-1)
class Solution {
public:
int jumpFloorII(int number) {
return pow(2, number - 1);//2^(number-1)
}
};
矩形覆蓋
我們可以用2*1的小矩形橫着或者豎着去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?比如n=3時,2*3的矩形塊有3種覆蓋方法
思路:
對於很多遞歸問題,我們都可以通過歸納總結來找出他們的規律:
當n=1時,way=1(橫或豎)
當n=2時,way=2(全橫或全豎)
當n=3時,way=3(全豎&橫橫豎&豎橫橫)
當n=4時,way=5(全豎&全橫&豎橫橫豎&豎豎橫橫&橫橫豎豎)
當n=5時,way=8(全豎&豎橫橫豎豎&豎橫橫橫橫&豎豎橫橫豎&豎豎豎橫橫&橫橫豎豎豎&橫橫橫橫豎&橫橫豎橫橫)
.......
n=(n-1)+(n-2);
於是問題有轉換成了之前的斐波那契數列問題了,依舊時同樣的方法求解:
class Solution {
public:
int rectCover(int number) {
if(number <= 2) return number;
int one = 1, two = 2, sum = 0;
for (int i = 3; i <= number; i++) {
sum = one + two;
one = two;
two = sum;
}
return sum;
}
};