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

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

  1. 举例推导dp数组

按照这个递推公式dpi = dpi - 1 + dpi - 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;
} 
相关推荐
ZhengEnCi2 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
吞下星星的少年·-·5 小时前
Div.3 CF 1131A题(排序,模拟)
算法·模拟·排序
圣保罗的大教堂5 小时前
leetcode 453. 最小操作次数使数组元素相等 中等
leetcode
aichitang20246 小时前
代数拓扑学与现代前沿视角
考研·算法·数学建模·ai·拓扑学·高考
二本咕咕-机械转码6 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
-银雾鸢尾-6 小时前
两数之和-C++实现
c++·算法
j7~6 小时前
【动态规划算法专题】动态规划五部曲实战:泰波那契数、三步问题、最小花费爬楼梯
c++·算法·动态规划·数据结构与算法
倍利福猎头公司官方账号6 小时前
大企业HR如何向猎头公司清晰传达AI岗位的技术需求?
人工智能·算法·机器人·求职招聘·业界资讯
揽星河..7 小时前
【C++】类和对象
c++·算法