算法王冠上的明珠——动态规划之斐波那契数列问题

算法王冠上的明珠——动态规划之斐波那契数列问题

目录

1. 什么是动态规划

2. 动态规划步骤

状态表示

状态转移方程

初始化

填表顺序

返回值

3. 例题讲解及具体代码

3.1 LeetCode1137. 第 N 个泰波那契数


这篇文章是我第一篇关于动态规划的,所以我会先从什么是动态规划说起。

1. 什么是动态规划

动态规划是一种通过将复杂问题分解为重叠子问题,并利用子问题的解来高效求解原问题的算法思想。它的核心是避免重复计算,通过存储中间结果(即 “记忆化”)来优化时间复杂度。

其实简单来说就是通过前面的状态来定义后面的状态,比如说我们前面关于前缀和的文章其实就可以被归为动态规划的一种,只不过它比较简单,所以我把它放在了基础算法里面。

2. 动态规划步骤

做动态规划类题目的步骤就是下面这几步。

状态表示

状态表示就是我们数组对应的那个位置的值的含义,简单来说就是那个值代表着什么。比如说我们前面说的前缀和,那他的状态表示就是代表着原数组前面这些数的累加。

状态转移方程

状态转移方程就是根据上面的状态表示来得到的一个公式,比如说我们前面说的前缀和,它的状态转移方程就是dp[i]=dp[i-1]+nums[i]。

初始化

初始化的作用简单来说就是为了防止数组越界访问,所以我们在一开始会给dp表的一小部分值提前给好。方便我们后续计算。拿前缀和来说就是第0个位子我们会直接给0。

填表顺序

之所以我们要有填表顺序,是因为我们填当前位置的值会使用到前面的一些值,那么我们要确保前面的这些值都已经计算好了。

返回值

返回值就是返回题目要求的那个值。

接下来我们通过几道例题来了解这几个步骤。

3. 例题讲解及具体代码

3.1 LeetCode1137. 第 N 个泰波那契数

接下来我们来讲解下面这道题,题目意思也很简单,就是当前位置的值是由前面三个位置的值得来的。

所以在这道题里面它的状态表示就是当前位置值等于前面三个位置的值的和。

所以在这道题里面它的状态转移方程就是dp[i]=dp[i-1]+dp[i-2]+dp[i-3]。

它的初始化就是第0个位子设置为0,第一个和第二个位置设置为1。

填表顺序就是从前往后就好。

返回值就是第n个位置的值。

我们看下面这个代码,其实我们做动态规划的题目,只要可以把上面的这五步给写出来,那么代码的实现也就变的很简单了。

class Solution { public: int tribonacci(int n) { if(n==0) return 0; if(n==1||n==2) return 1; vector<int> dp(n+1); dp[0]=0; dp[1]=1; dp[2]=1; for(int i=3;i<=n;++i) dp[i]=dp[i-1]+dp[i-2]+dp[i-3]; return dp[n]; } };

3.2 面试题 08.01. 三步问题

我们看下面这道题就稍微有一点点难了,要我们算的是小孩走到这n步时的方法。

状态表示:dp[n]表示走到当前位置时的方法数。

状态转移方程:这道题的状态转移方程稍微有点难,我们看下面这个图,0代表的是地板。然后我们到a就1种办法(一步),到b有2种(一步一步,两步),到c的方法有4种(一步一步一步,一步两步,两步一步,三步),接着我们就不用自己算了,因为按照题目的要求,从a,b,c位置可以走到d位置,所以我们这里直接就是d前面三个位置办法的和就好了。我一开始在做的时候是想着是前三个位置的办法数加上多少多少,后来经过尝试发现不是。因为我们可以这样去想如果a位置的值要加上多少多少的话,那么就会把b和c的一部分给计算进去了,会造成重复计算,所以我们不要去关心abc是怎么到d位置的,我们要记住每一个位置的值代表的是到该位置的方法数,而一个位置只有它前面的三个可以到,所以加上前面三个的方法数就好了。

PS:如果还是觉得不太理解的话,那么就画个图,把abc的方法都画出来,这样也可以理解。

初始化:在上面已经写了,到a就1种办法(一步),到b有2种(一步一步,两步),到c的方法有4种(一步一步一步,一步两步,两步一步,三步)。

填表顺序:由题可得是从前向后填表。

返回值:返回值就是n位置的方法数。

我们看,只要我们知道上面的那5个,那么代码就可以直接写出来了。

我们在dp[i-1]+dp[i-2]这里也模上了一个1000000007,是因为在这里也会过大。所以我们要先模一下。

class Solution { public: int waysToStep(int n) { if(n==1) return 1; if(n==2) return 2; if(n==3) return 4; vector<int> dp(n+1); dp[1]=1; dp[2]=2; dp[3]=4; for(int i=4;i<=n;++i) dp[i]=((dp[i-1]+dp[i-2])%1000000007+dp[i-3])%1000000007; return dp[n]; } };

Read more

GitHub 学生认证申请流程与常见问题(实测经验分享)

GitHub 学生认证申请流程与常见问题(实测经验分享)

通过后效果展示 完成 GitHub 学生认证后,可在 GitHub 官网使用学生包内相关开发资源,并可在 VS Code 中启用(如 Copilot 等符合政策的功能),有助于学习与代码编写。 申请认证流程: 1.注册登录Github网站         找到学生认证 入口。 2.绑定并验证学校邮箱         申请过程会让你使用绑定你的学校邮箱并验证 3.开启 2FA(双因素认证)         该步需通过浏览器安装插件,Edge浏览器在扩展中搜索:身份验证器插件         过程中其他步骤参考该博客即可:Enable two-factor authentication (2FA) -github解决方案 提醒:生成的密钥 / 恢复代码一定要妥善保存,丢失会给后续登录带来麻烦。!!!         按教程一般能顺利到达输入验证这一步,选择第一项,使用你电脑先前设置的 PIN 即可。 4.提交证明材料         证明类型选择第 1 项:

By Ne0inhk

Qwen3-235B开源模型:220亿激活参数加持,256K上下文升级

Qwen3-235B开源模型:220亿激活参数加持,256K上下文升级 【免费下载链接】Qwen3-235B-A22B-Instruct-2507Qwen3-235B-A22B-Instruct-2507是一款强大的开源大语言模型,拥有2350亿参数,其中220亿参数处于激活状态。它在指令遵循、逻辑推理、文本理解、数学、科学、编程和工具使用等方面表现出色,尤其在长尾知识覆盖和多语言任务上显著提升。模型支持256K长上下文理解,生成内容更符合用户偏好,适用于主观和开放式任务。在多项基准测试中,它在知识、推理、编码、对齐和代理任务上超越同类模型。部署灵活,支持多种框架如Hugging Face transformers、vLLM和SGLang,适用于本地和云端应用。通过Qwen-Agent工具,能充分发挥其代理能力,简化复杂任务处理。最佳实践推荐使用Temperature=0.7、TopP=0.8等参数设置,以获得最优性能。 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-235B-A22B-Instruct-2507 导语:阿里达

By Ne0inhk
本地代码上传远程GitHub仓库小白教程(GitHub Desktop、详细图解)

本地代码上传远程GitHub仓库小白教程(GitHub Desktop、详细图解)

目录 一、前言 二、下载安装GitHub Desktop 三、登录使用GitHub Desktop 四、本地代码上传远程GitHub仓库 一、前言 这篇博客是我在学习GitHub使用时,在跟着b站教学视频实操成功的个人记录。原视频博主提到Git对于小白来说不是很友好,需要记的指令太多了,所以下载按照GitHub官方的GitHub Desktop对小白来说会更加简单方便。然后后续就是本博客记录本地代码通过GitHub Desktop上传远程GitHub仓库的小白教程(在使用GitHub Desktop时建议科学上网或者是开加速器,这里就不提了,懂的都懂,不可言传) 二、下载安装GitHub Desktop 直接浏览器搜索GitHub Desktop,认准官网的去下载安装即可 网页应该会自动识别要下载的版本,点击Download即可 下载完成之后点击打开文件就会自动下载安装(此图仅供展示,我安装完就把文件删了) 桌面出现快捷图标就表示安装完成了(由于自动安装的整个过程都没有出现选择安装路径的提示,我查看属性发现是在c盘就想着重新安装到d盘,然后从联想应用商

By Ne0inhk

gitea安装及使用方法(常用命令)

Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。接下来说说怎么安装以及一些简单使用方法: 一、下载安装包         1、gitea安装包:Gitea | gitea 二、安装         2.1 gitea 安装                 1、把下载好的安装包(gitea-1.25.3-windows-4.0-amd64.exe),放到D:\gitea(可以自己定义),双击gitea-1.25.3-windows-4.0-amd64.exe; 弹出: 在浏览器中输入:http://localhost:3000 回车后,弹出: 我这里选择SQLite3,

By Ne0inhk