猴子爬楼梯,一次可以爬1个台阶或者3个台阶,n个台阶有多少种爬法
找规律,先一个一个算:
n = 1; // 1
x = 1;
n = 2; // 1 1
x = 1;
n = 3; // 1 1 1; 3
x = 2;
n = 4; // 1 1 1 1; 3 1; 1 3;
x = 3;
n = 5; // 1 1 1 1 1; 3 1 1; 1 3 1; 1 1 3;
x = 4;
n = 6; // 1 1 1 1 1 1; 3 1 1 1; 1 3 1 1; 1 1 3 1; 1 1 1 3; 3 3;
x = 6;
n = 7; // 1 1 1 1 1 1 1; 3 1 1 1 1; 1 3 1 1 1; 1 1 3 1 1; 1 1 1 3 1;
// 1 1 1 1 3; 3 3 1; 3 1 3; 1 3 3;
x = 9;
n = 8; // 1 1 1 1 1 1 1 1; *1
// 3 1 1 1 1 1; *6
// 3 3 1 1; 3 1 3 1; 3 1 1 3; 1 3 3 1; 1 3 1 3; 1 1 3 3; *6
x = 13;
这不是斐波那契数列,但区别不大
f(N) = f(N -1) + f(N - 3)
整个记录表,递推。
#include <iostream>
#include <vector>
class Solution
{
public:
/**
*
* @param n int整型
* @return int整型
*/
static auto climbStairs(int n) -> int
{
if (n < 3)
{
return 1;
}
std::vector<int> table{1, 1, 1};
table.reserve(100);
for (int i = 3; i != n; ++i)
{
table.push_back(table[i - 1] + table[i - 3]);
}
return table[n - 1] + table[n - 3];
}
};
int main()
{
std::cout << Solution::climbStairs(8) << std::endl;
return 0;
}