斐波那契数列的记忆化搜索与动态规划解法 C++实现 以及相关案例分析(Leetcode70—爬楼梯)
Fibonacci数列的递推解析式:F(n)=F(n-1)+F(n-2)
普通无优化的解法
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int num=0;
int Fibonacci(int n)
{
num++;
if(n==1||n==2)
return 1;
return Fibonacci(n-1)+Fibonacci(n-2);
}
int main(int argc, char *argv[]) {
int x=40;
x=Fibonacci(x);
cout<<x<<endl<<num<<endl;
return 0;
}
使用记忆化搜索自顶向下优化的解法
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
vector<int> memo;
int num=0;
int Fibonacci(int n)
{
num++;
if(n==1||n==2)
return 1;
if(memo[n]!=-1)
return memo[n];
memo[n]=Fibonacci(n-1)+Fibonacci(n-2);
return memo[n];
}
int main(int argc, char *argv[]) {
int x=40;
memo = vector<int>(x+1,-1);
x=Fibonacci(x);
cout<<x<<endl<<num<<endl;
return 0;
}
使用动态规划自底向上优化的解法
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
vector<int> memo;
int main(int argc, char *argv[]) {
int x=40;
memo = vector<int>(x+1,-1);
memo[0]=0;
memo[1]=1;
for(int i=2;i<=x;i++)
{
memo[i]=memo[i-1]+memo[i-2];
}
cout<<memo[x]<<endl;
return 0;
}
Leetcode相关问题
70. Climbing Stairs
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note: Given n will be a positive integer.
Example 1:
Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps
Example 2:
Input: 3
Output: 3
Explanation: There are three ways to climb to the top.
1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step
动态规划虽然跟记忆化搜索同样是0(n)的时间复杂度,但是动态规划会比记忆化搜索稍微快一点,所以这道题就直接用动态规划解出来了,跟斐波那契数列基本是一模一样
class Solution {
public:
int climbStairs(int n) {
vector<int> memo = vector<int>(n+1,-1);
memo[1]=1;
memo[2]=2;
for(int i=3;i<=n;i++)
{
memo[i]=memo[i-1]+memo[i-2];
}
return memo[n];
}
};