您的位置:首页 > 其它

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

2016-06-13 11:36 357 查看
关键思路

(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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划 优化