斐波那契数(力扣LeetCode)动态规划

斐波那契数(力扣LeetCode)动态规划

题目描述

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1

F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n)
示例 1:

输入:n = 2

输出:1

解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:

输入:n = 3

输出:2

解释:F(3) = F(2) + F(1) = 1 + 1 = 2
示例 3:

输入:n = 4

输出:3

解释:F(4) = F(3) + F(2) = 2 + 1 = 3
提示:

0 <= n <= 30

动规五部曲:

这⾥我们要⽤⼀个⼀维dp数组来保存递归的结果

  1. 确定dp数组以及下标的含义
    dp[i]的定义为:第i个数的斐波那契数值是dp[i]
  2. 确定递推公式
    为什么这是⼀道⾮常简单的⼊⻔题⽬呢?
    因为题⽬已经把递推公式直接给我们了:状态转移⽅程 dp[i] = dp[i - 1] + dp[i - 2];
  3. dp数组如何初始化
    题⽬中把如何初始化也直接给我们了,如下:
  4. 确定遍历顺序
c 复制代码
dp[0] = 0;
dp[1] = 1;

从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序⼀定是从前到后遍历的

  1. 举例推导dp数组

按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导⼀下,当N为10的时候,dp数组应该是如下的数列:

0 1 1 2 3 5 8 13 21 34 55

如果代码写出来,发现结果不对,就把dp数组打印出来看看和我们推导的数列是不是⼀致的。

代码

力扣提交代码

cpp 复制代码
class Solution {
public:
    int fib(int N) {
        if (N <= 1) return N;
        vector<int> dp(N + 1);
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= N; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[N];
    }
};

总代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int fib(int n)
{
	if(n<=1)
		return n;
	int f[31];
	f[0]=0;
	f[1]=1;
	for(int i=2;i<=n;i++)
	{
		f[i]=f[i-1]+f[i-2];
	}
	return f[n];
}

int main()
{
	int n;
	scanf("n = %d",&n);
	printf("%d",fib(n));
	return 0;
} 
相关推荐
课堂剪切板17 分钟前
ch03 部分题目思路
算法
山登绝顶我为峰 3(^v^)31 小时前
如何录制带备注的演示文稿(LaTex Beamer + Pympress)
c++·线性代数·算法·计算机·密码学·音视频·latex
Two_brushes.2 小时前
【算法】宽度优先遍历BFS
算法·leetcode·哈希算法·宽度优先
森焱森4 小时前
水下航行器外形分类详解
c语言·单片机·算法·架构·无人机
QuantumStack6 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
写个博客7 小时前
暑假算法日记第一天
算法
绿皮的猪猪侠7 小时前
算法笔记上机训练实战指南刷题
笔记·算法·pta·上机·浙大
hie988948 小时前
MATLAB锂离子电池伪二维(P2D)模型实现
人工智能·算法·matlab
杰克尼8 小时前
BM5 合并k个已排序的链表
数据结构·算法·链表
.30-06Springfield9 小时前
决策树(Decision tree)算法详解(ID3、C4.5、CART)
人工智能·python·算法·决策树·机器学习