leetcode#70 爬楼梯
题目:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
思路:
1、递推
2、矩阵快速幂
先写一个两个矩阵相乘的函数multi,再写快速幂函数。需要注意的是在mutli函数中需要一个临时的矩阵存储结果,不能实时存储结果,因为当前存储结果会影响下一次的计算。
class Solution
{
public:
long long ans[2][2] = {1, 0, 0,1};
void multi(long long A[][2], long long B[][2])
{
long long tmp[2][2] = {0, 0, 0, 0};
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 2; ++j)
for (int k = 0; k < 2; ++k)
tmp[i][j] += A[i][k] * B[k][j];
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 2; ++j)
A[i][j] = tmp[i][j];
}
void matrix_pow(long long a[][2], long long b)
{
while (b)
{
if (b & 1)
multi(ans, a);
multi(a, a);
b >>= 1;
}
}
int climbStairs(int n)
{
n++;
if (n == 1 || n == 2)
return 1;
long long tmp[2][2]={0,1,1,1};
matrix_pow(tmp, n - 2);
return ans[1][0] + ans[1][1];
}
};