1137 第N个泰波那契数 力扣 动态规划 快速幂
- 动态规划 递推练习
- 尝试了一下昨天的思路,练习利用矩阵幂来解决这种问题
- 本来首先尝试的官方题解那样解法的,但是不知道一开始做的时候觉得怪怪的,就换了这个思路,其实大差不差
- 关键在于找到进行幂乘的初始矩阵,以及确定指数是否为n(因为本题的状态选取影响了指数并不是n)
- 最后判断是选取得到的矩阵的哪一个元素
- 还要注意的一点是,矩阵里单个元素类型,因为是幂次所以如果定义为int,n稍大就很容易溢出,所以可定义为long ,或者long long
- 就本题而言AC比较容易,也没有那么复杂,只不过就是借本题来练习一下这个思路
分析:
本人代码
class Solution {
public:
vector<vector<long>>multiply(vector<vector<long>>& a, vector<vector<long>>& b)
{
vector<vector<long>>c(3,vector<long> (3));
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
c[i][j] = a[i][0] * b[0][j] + a[i][1] * b[1][j] + a[i][2] * b[2][j];
return c;
};
vector<vector<long>>matrix_pow(vector<vector<long>>a, int n)
{
vector<vector<long>> ret = { {1,0,0},{0,1,0},{0,0,1} };
while (n>0)
{
if ((n & 1) == 1)ret = multiply(ret, a);
n >>= 1;
a = multiply(a, a);
}
return ret;
};
int tribonacci(int n) {
vector<vector<long>> initial_A = { {4,3,2},{2,2,1},{1,1,1}};
vector<vector<long>> initial_B = {{1,0,0},{1,0,0},{0,0,0}};
int t_0 = 0, t_1 = 1, t_2 = 1;
if (n == 0)return 0;
if ((n == 1)||(n == 2))return 1;
vector<vector<long>> f = matrix_pow(initial_A,(n/3));
vector<vector<long>> res=multiply(f,initial_B);
if(n%3== 0) return res[2][0];
else if(n%3==1) return res[1][0];
else return res[0][0];
}
};