《算法闯关指南:动态规划算法--斐波拉契数列模型》--01.第N个泰波拉契数,02.三步问题

《算法闯关指南:动态规划算法--斐波拉契数列模型》--01.第N个泰波拉契数,02.三步问题
在这里插入图片描述

🔥草莓熊Lotso:个人主页
❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!


🎬 博主简介:

在这里插入图片描述

文章目录


前言:

聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找“最优解”。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。 贪心算法:理解“局部最优”到“全局最优”的思路,解决区间调度等问题 内容以题带点,讲解思路与代码实现,帮助大家快速提升代码能力。

01.第N个泰波拉契数

题目链接

1137. 第 N 个泰波那契数 - 力扣(LeetCode)

题目描述

在这里插入图片描述


题目示例

在这里插入图片描述

解法(动态规划):

算法流程:

1. 状态表示
这道题可以【根据题目要求】直接定义出状态表示:
dp[i] 表示:第 i 个泰波拉契数的值
2. 状态转移方程
题目已经很贴心的告诉了我们:
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
3. 初始化

从我们的递推公式可以看出,dp[i]i=0 以及 i=1 的时候是没有办法进行推导的,因为 dp[-2]dp[-1] 不是一个有效的数据。
因此我们需要在填表之前,将 0,1,2 位置的值初始化。题目中已经告诉我们 dp[0] = 0,dp[1] = dp[2] =1
4. 填表顺序
毫无疑问是【从左往右】。
5. 返回值
应该返回 dp[n] 的值。

C++算法代码:

classSolution{public:inttribonacci(int n){//处理边界if(n==0)return0;if(n==1||n==2)return1; vector<int>dp(n+1); dp[0]=0,dp[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];}};

滚动数组空间优化(了解即可)

classSolution{public:inttribonacci(int n){//处理边界if(n==0)return0;if(n==1||n==2)return1;//滚动数组优化int a=0,b=1,c=1,d=0;for(int i=3;i<=n;i++){ d=a+b+c;//滚动操作 a=b,b=c,c=d;}return d;}};

算法总结&&笔记展示:

笔记字有点丑,大家见谅:

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

02.三步问题

题目链接

面试题 08.01. 三步问题 - 力扣(LeetCode)

题目描述

在这里插入图片描述

题目示例

在这里插入图片描述

解法(动态规划):

算法思路:

1. 状态表示
这道题可以根据【经验+题目要求】直接定义出状态表示:
dp[i] 表示:到达 i 位置时,一共有多少种方法。
2. 状态转移方程
以 i 位置状态的最近的一步,来分情况讨论:
如果 dp[i] 表示小孩上第 i 阶楼梯的所有方式,那么他应等于所有上一步的方式之和:

  • 上一步上一级台阶:dp[i] += dp[i-1]
  • 上一步上两级台阶:dp[i] += dp[i-2]
  • 上一步上三级台阶:dp[i] += dp[i-3]

综上所述,dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
需要注意的是,这道题目说,由于结果可能很大,需要对结果取模。
在计算的时候,三个值全部加起来再取模是不行的,大家可以自己取试试。对于这类问题,我们每计算一次(两个数相加/乘等),都需要取一次模。否则,万一发生了溢出,我们的答案就错了。
3. 初始化
从我们的递推公式可以看出,dp[i]i=0,i=1 以及 i=2 的时候是没有办法进行推导的,因为 dp[-3]dp[-2]dp[-1] 不是一个有效的数据。
因此我们需要在填表之前,将 1,2,3 位置的值初始化。
根据题意,dp[1] = 1,dp[2] = 2,dp[3] = 4
4. 填表顺序
毫无疑问是【从左往右】。
5. 返回值
应该返回 dp[n] 的值。

C++算法代码:

classSolution{public:intwaysToStep(int n){// 1. 创建 dp 表// 2. 初始化// 3. 填表// 4. 返回constint MOD=1e9+7;// 处理边界情况if(n==1||n==2)return n;if(n==3)return4; 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])%MOD+dp[i-3])%MOD;return dp[n];}};

滚动数组空间优化(了解即可)

classSolution{public:intwaysToStep(int n){// 1. 创建 dp 表// 2. 初始化// 3. 填表// 4. 返回constint MOD=1e9+7;// 处理边界情况if(n==1||n==2)return n;if(n==3)return4;//空间优化int a=1,b=2,c=4,d=0;for(int i=4;i<=n;i++){ d=((a+b)%MOD+c)%MOD; a=b,b=c,c=d;}return d;}};

算法总结&&笔记展示:

笔记字有点丑,大家见谅:

在这里插入图片描述


在这里插入图片描述

结尾:

🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点: 👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长 ❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量 ⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用 💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑 🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解 技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标! 

结语:本文聚焦动态规划算法实战,通过两道经典题目《第N个泰波拉契数》和《三步问题》系统讲解动态规划的核心思路。 泰波拉契数:定义状态dp[i]表示第i个数的值,状态转移方程为dp[i]=dp[i-1]+dp[i-2]+dp[i-3],通过初始化边界和填表顺序(从左到右)求解,并提供滚动数组优化代码。 三步问题:状态dp[i]表示到达i台阶的方法数,转移方程为dp[i]=dp[i-1]+dp[i-2]+dp[i-3],强调取模防止溢出,并给出空间优化方案。

✨把这些内容吃透超牛的!放松下吧✨ʕ˘ᴥ˘ʔづきらど

Read more

备战蓝桥杯----C/C++组 (一)所需C++基础知识(上)

备战蓝桥杯----C/C++组 (一)所需C++基础知识(上)

个人主页: wengqidaifeng ✨永远在路上,永远向前走 个人专栏: 数据结构 C语言 嵌入式小白启动! 重要OJ算法题详解 文章目录 * 前言 * 一. 分析大纲,了解所需 * 1. 大纲显示内容 * 2、组别划分与难度关系 * 3、知识点结构分析(按组别) * 3.1 大学C组:基础入门阶段 * 3.2 大学B组:中级提高阶段 * 3.3 大学A组 / 研究生组:高级挑战阶段 * 4.难度系数说明 * 二. C++基础语法(上):从零开始的编程基石 * 1.前言 * 2.开发环境搭建 - DevC++的安装与使用 * 2.1

By Ne0inhk
【C++】 map/multimap底层原理与逻辑详解

【C++】 map/multimap底层原理与逻辑详解

【C++】 map/multimap底层原理与逻辑详解 * 摘要 * 目录 * 一、`map` * 1. 类模板认识 * 2. 构造函数认识 * 3. 迭代器和范围for的使用 * 4. insert的使用 * 5. empty 和size的使用 * 6. erase的使用 * 7. swap 和 clear的使用 * 8. find的使用 * 9. count的使用 * 11. lower_bound 和 upper_bound的使用 * 12. equal_range的使用 * 13. operator= 的使用 * 14. operator[ ] 的使用 * 二、`multimap` * 1. 模板和类模板的认识 * 2. insert的使用 * 3.

By Ne0inhk
【Spring AI & LangChain4j 进阶篇】Milvus/Redis向量库整合Java:RAG核心环节手把手代码实现

【Spring AI & LangChain4j 进阶篇】Milvus/Redis向量库整合Java:RAG核心环节手把手代码实现

🍃 予枫:个人主页 📚 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常》 💻 Debug 这个世界,Return 更好的自己! 引言 大模型幻觉是落地路上的“绊脚石”,而RAG(检索增强生成)正是破解这一痛点的核心方案。作为Java开发者,如何依托Spring AI、LangChain4j等生态,实现从文档解析、向量存储到检索生成的全链路落地?本文拆解RAG核心逻辑,手把手教你用Java搭建可直接复用的RAG系统,覆盖多格式文档处理、主流向量库整合与全流程优化,干货拉满,建议收藏! 文章目录 * 引言 * 一、RAG核心认知:为什么它能解决大模型幻觉? * 1.1 RAG是什么?核心逻辑拆解 🧩 * 1.2 RAG适用场景与全链路流程 * 1.2.1 核心适用场景 * 1.2.2 RAG全链路核心流程(Java视角) * 二、

By Ne0inhk
飞算JavaAI:智能ai工具箱,普通程序员也能高效交付

飞算JavaAI:智能ai工具箱,普通程序员也能高效交付

做程序员这些年,最烦的就是接到需求模糊、涉及模块多的项目——就像这次要开发的本地生活食材配送平台,需求只写了“支持商家入驻、用户下单、食材溯源、配送调度、售后维权”,具体怎么拆分功能、设计架构,完全没头绪。换以前,光和产品经理对接需求、画架构图就要3天,加上编码、调试,没两周根本交不出活。但用了飞算JavaAI专业版后,整个开发周期压缩到一周,还提前2天完成测试上线,核心靠的就是它的智能引导系统和实用AI工具,让复杂项目开发变得有条理、高效率。 智能引导五步法:从模糊需求到可落地代码,一步不卡壳 面对食材配送平台的多元需求,我一开始只知道核心方向,具体的功能模块、接口设计、数据存储完全是一团乱麻。飞算JavaAI的智能引导系统,就像一个贴身助手,一步步帮我把需求拆解、落地,全程没遇到卡壳的地方。 1. 第一步理解需求仅用 15 秒就拆解出 12 个关键功能点,涵盖商家、用户、商品、订单、配送等基础模块,还补充了食材溯源、

By Ne0inhk