Fibonacci的快速幂求法时间是O(lgn)
#include<iostream>
#include<cmath>
using namespace std;
typedef unsigned long long int LINT;
//函数 Fibonacci采用快速的幂的方法可以实现快速的 Fibonacci避免了相应的计算;
//其中f0和f1是初始的条件
//n代表的是所要求的fn的下标
int Fibonacci(LINT f0,LINT f1,LINT n)
{
LINT fn;
int n_bi=ceil(log(n+1)/log(2));
LINT *array_n_bi=new LINT[n_bi]();
for( int i=0;i<n_bi;++i)
{
array_n_bi[i]=n%2;
n/=2;
}
LINT** matrix=new LINT*[n_bi];
for( int i=0;i<n_bi;++i)
matrix [i]=new LINT[4]();
matrix[0][0]=0;
matrix[0][1]=1;
matrix[0][2]=1;
matrix[0][3]=1;
for( int i=1;i<n_bi;++i)
{
matrix[i][0]=(matrix[i-1][0]*matrix[i-1][0]+matrix[i-1][1]*matrix[i-1][2]);
matrix[i][1]=(matrix[i-1][0]*matrix[i-1][1]+matrix[i-1][1]*matrix[i-1][3]);
matrix[i][2]=(matrix[i-1][2]*matrix[i-1][0]+matrix[i-1][3]*matrix[i-1][2]);
matrix[i][3]=(matrix[i-1][2]*matrix[i-1][1]+matrix[i-1][3]*matrix[i-1][3]);
}
LINT m11=1;
LINT m12=0;
LINT m21=0;
LINT m22=1;
LINT temp_m11=1;
LINT temp_m12=0;
LINT temp_m21=0;
LINT temp_m22=1;
for( int i=0;i<n_bi;++i)
{
if(array_n_bi[i]==1)
{
m11=(temp_m11*matrix[i][0]+temp_m12*matrix[i][2]);
m12=(temp_m11*matrix[i][1]+temp_m12*matrix[i][3]);
m21=(temp_m21*matrix[i][0]+temp_m22*matrix[i][2]);
m22=(temp_m21*matrix[i][1]+temp_m22*matrix[i][3]);
temp_m11=m11;
temp_m12=m12;
temp_m21=m21;
temp_m22=m22;
}
}
fn=(m11*f0+m21*f1);
cout<<fn<<endl;
return fn;
}
int main()
{
unsigned long long int n;
cin>>n;
if(n<3)
cout<<n<<endl;
else
{
int res=Fibonacci(1,1,n);
}
}
01背包问题(动态规划)
#include<cstdio>
using namespace std;
//函数 knapsack_problem_01中
//need代表的是物品需要的空间数组
//value代表的是物品价值数组
//m代表的是背包的最大容量
//n代表的是物品的个数
int knapsack_problem_01(int *need,int* value,int m,int n)
{
int * f=new int[m]();
for(int i=0;i<n;++i)
for(int j=m;j>=need[i];--j)
if(f[j]<f[j-need[i]]+value[i])
f[j]=f[j-need[i]]+value[i];
return f[m-1];
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int *need=new int[n];
int* value=new int[n];
for(int i=0;i<n;++i)
scanf("%d%d",need+i,value+i);
printf("%d\n",knapsack_problem_01(need,value, m,n));
}
对树以行为单位进行的操作
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void levelOrder(TreeNode* root) {
vector<vector<int>> res;
if (root == NULL)
{
//TODO
///空树的处理
}
if (root->left == NULL&&root->right == NULL)
{
//TODO
//只有一个节点的树的处理
}
queue<TreeNode *> queue0, queue1;
queue0.push(root);
TreeNode * pre;
int op01 = 0;
while (!queue0.empty() || !queue1.empty())
{
if (op01 == 0)
{
//{
TODO
一行开始前的处理
//}
while (!queue0.empty())
{
pre = queue0.front();
queue0.pop();
//{
TODO
//对行中的节点进行的处理
//}
if (pre->left != NULL)
queue1.push(pre->left);
if (pre->right != NULL)
queue1.push(pre->right);
}
//{
TODO
一行结束时的处理
//}
op01 = 1;
}
else{
//{
TODO
一行开始前的处理
//}
while (!queue1.empty())
{
pre = queue1.front();
queue1.pop();
//{
TODO
//对行中的节点进行的处理
//}
if (pre->left != NULL)
queue0.push(pre->left);
if (pre->right != NULL)
queue0.push(pre->right);
}
//{
TODO
一行结束时的处理
//}
op01 = 0;
}
}
return ;
}