类斐波那契问题中动态规划的时间复杂度优化

关键思路
(1)从递推公式求解状态转移方程->转移矩阵
f(n)= f(n-1)+f(n-2)
[f(n),f(n-1)] = [ f(1), f(2)] * [(1,1);(1,0)]^(n-2)
(2)优化求矩阵的幂问题!!!



#include <iostream>
using namespace std;


 void matrixMulti(int const m1[][2],int const m2[][2], int res[][2]){

        for(int i = 0; i <2; i++)
            for(int j = 0; j < 2 ; j++)
                res[i][j] = m1[i][0]*m2[0][j] + m1[i][1]*m2[1][j];
 }

int matrixPower( int* a ,int matrix[][2] ,int order){

    int temp[][2] = {{1,0},{0,1}};
//    int** res = new int* [2];
//    for(int i = 0; i < 2; i ++)
//        res[i] = new int[2];
    int res[2][2];

    for(; order!= 0 ; order>>=1){
        if((order&1) != 0){
            matrixMulti(temp,matrix,res);

            for(int i = 0 ; i < 2; i++)
                for(int j = 0 ; j<2; j++)
                    temp[i][j] = res[i][j];
        }
        matrixMulti(matrix,matrix,res);
        for(int i = 0 ; i < 2; i++)
                for(int j = 0 ; j<2; j++)
                    matrix[i][j] = res[i][j];
    }

    return a[0]*temp[0][0] + a[1]*temp[1][0];

}




int f1(int n){
    int res;
    if( n==1 || n ==2 )
        return 1;
    if(n<0)
        return 0;

    /*
    * [f(n),f(n-1)] = [ f(1), f(2)] * [(1,1);(1,0)]^(n-2)
    */
    int matrix[2][2] = {{1,1},{1,0}};
    int base[2] = {1,1};

    return matrixPower( base ,matrix ,n-2);

}



int main()
{

    int N;
    while(cin>>N)
    {
        for(int i = 1; i <=N; i++)
            cout<<f1(i)<<" ";
        cout<<endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值