斐波那契数列的记忆化搜索与动态规划解法 C++实现 以及相关案例分析(Leetcode70—爬楼梯)

斐波那契数列的记忆化搜索与动态规划解法 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];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老陈聊架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值