《算法闯关指南:动态规划算法--斐波拉契数列模型》--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

绿联云NAS配置webdav

绿联云NAS配置webdav

前言         zotero使用webdav服务时使用绿联自带的webdav服务只能使用http协议,并且只能在局域网内传输,故而尝试自行配置,以期实现公网文献同步。 注:非专业,自己在配置的时候也是根据前人的分享实现的,可能有很多不准确的地方,请见谅。 1. 大致思路         购买域名(腾讯云)→配置DDNS-go(docker)→获取SSL证书(乐此加密)→配置natfrp(docker) ①域名:固定域名,后续内网穿透时可以使用自定义域名; ②DDNS-go:自动更新域名解析到公网IP; ③SSL证书:https协议需要; ④natfrp:内网穿透需要,这里使用的是Sakura Frp。 2.参考文献 (31 封私信 / 80 条消息) 绿联 NAS 域名直连 DDNS-Go+IPv6 内网穿透并开启 HTTPS - 知乎https://zhuanlan.zhihu.com/p/

By Ne0inhk

M2LOrder轻量级WebUI部署:7861端口图形界面+无浏览器插件依赖开箱即用

M2LOrder轻量级WebUI部署:7861端口图形界面+无浏览器插件依赖开箱即用 1. 引言:让情感分析变得触手可及 你有没有遇到过这样的场景? * 想快速分析用户评论的情感倾向,却不想写复杂的代码 * 需要批量处理大量文本的情感分类,但手动操作太耗时 * 希望有一个直观的界面来查看情感分析结果,而不是面对冷冰冰的API响应 如果你有这些需求,那么M2LOrder的WebUI界面就是为你准备的。这是一个基于Gradio构建的轻量级图形界面,专门为情绪识别和情感分析服务设计,最大的特点就是开箱即用——不需要安装任何浏览器插件,打开网页就能用。 今天我要分享的就是如何快速部署和使用这个WebUI服务。它运行在7861端口,提供了从模型选择到批量分析的完整功能,而且整个过程简单到只需要几条命令。无论你是开发者、产品经理,还是数据分析师,都能在几分钟内上手。 2. M2LOrder是什么? 2.1 核心功能 M2LOrder是一个专门做情绪识别和情感分析的服务。简单来说,你给它一段文字,它就能告诉你这段文字表达的是高兴、悲伤、愤怒还是其他情绪,并且给出一个置信度分

By Ne0inhk

【n8n入门教程08】n8n 触发节点完全指南:定时器、Webhook 和手动触发

n8n工作流分享:商业级别的5个实用自动化工作流分享,诚意满满 n8n 触发节点完全指南:定时器、Webhook 和手动触发 在 n8n 自动化平台中,触发节点是工作流的起点,决定了整个流程的启动方式。无论是定时任务、外部事件还是手动测试,合理选择和配置触发节点,是实现高效自动化的基础。今天就来详细讲讲 n8n 的三类主流触发节点,帮你灵活应对各种业务场景。 手动触发节点(Manual Trigger) Manual Trigger 节点主要用于开发和调试阶段。把它放在工作流起点后,可以通过编辑器的 “Execute Workflow” 按钮手动启动流程,实时观察结果。 这个节点不会自动运行,也无法被外部事件触发,只有在你手动执行时才会生效。特别适合测试用途,你可以通过它手动运行整个流程,验证逻辑和数据流是否符合预期。 使用场景: * 开发调试新工作流 * 测试工作流的各个节点 * 验证数据流转是否正确 注意事项: * 一个工作流只能有一个 Manual Trigger 节点 * 仅在开发调试时使用,生产环境应该用其他触发器

By Ne0inhk
微信小程序webview postmessage通信指南

微信小程序webview postmessage通信指南

需求概述 在微信小程序中使用 web-view 组件与内嵌网页进行双向通信,主要通过 postMessage 实现。以下是完整的配置和使用方法: 通信指南 微信小程序webview官方文档 1. 基础配置 小程序端配置 // app.json 或 page.json { "usingComponents": {}, "permission": { "scope.webView": { "desc": "用于网页和小程序通信" } } } 网页端配置 <!-- 内嵌网页需引入微信JS-SDK --> <script src="https://res.wx.qq.com/open/

By Ne0inhk