实用指南:经典动态规划题解
目录
1. 1137. 第 N 个泰波那契数
2. 746. 使用最小花费爬楼梯
3. 746. 爬楼梯的变异:三步问题(waysToStep)
4. 91. 解码方法
总结:动态规划的通用解题步骤
动态规划(DP)是算法中的重要思想,核心是“用已求结果推导当前结果”,常能将暴力解法的高复杂度优化为线性。本文通过四道经典题目,拆解DP的基础思路与避坑要点。
1. 1137. 第 N 个泰波那契数
题目核心
求泰波那契数列的第n项,数列定义为: T(0)=0,T(1)=1,T(2)=1,T(n)=T(n-1)+T(n-2)+T(n-3) (n≥3)。
解题思路
- 状态定义:无需额外DP数组,用三个变量 a、b、c 分别代表 T(n-3)、T(n-2)、T(n-1) ,通过迭代更新变量值,避免空间浪费。
- 递推逻辑:从n=3开始,每次计算 T(n)=a+b+c ,再将 a→b 、 b→c 、 c→T(n) ,逐步推进到第n项。
- 边界处理:直接判断n=0、1、2的情况,返回固定值,避免进入循环。
代码实现
class Solution {
public:
int tribonacci(int n) {
if(n==0)return 0;
if(n==1||n==2)return 1;
int a = 0, b = 1, c = 1;
for(int i=3;i<=n;i++)
{
int d = a + b + c;
a = b;
b = c;
c = d;
}
return c;
}
};
易错点
- 无需用数组存储所有项:新手易习惯性定义 dp[n] 数组,但本题只需前三项结果,用变量迭代可将空间复杂度从O(n)降至O(1)。
2. 746. 使用最小花费爬楼梯
题目核心
楼梯有n阶,每次可爬1或2阶,每阶对应“爬上去的成本” cost[i] ,求到达楼顶(第n阶,无成本)的最小成本。
解题思路
- 状态定义: dp[i] 表示到达第i阶的最小成本。
- 递推逻辑:到达第i阶只有两种路径:
1. 从第i-1阶爬1阶,成本为 dp[i-1] + cost[i-1] ( cost[i-1] 是第i-1阶的成本);
2. 从第i-2阶爬2阶,成本为 dp[i-2] + cost[i-2] 。
取两者最小值作为 dp[i] ,即 dp[i] = min(dp[i-1[icost[i-1], dp[i-2[icost[i-2]) 。
- 边界处理: dp[0] = 0 (起点在第0阶,无需成本)、 dp[1] = 0 (可直接从第0阶或第1阶起步,均无额外成本)。
代码实现
class Solution {
public:
int minCostClimbingStairs(vector& cost) {
int n = cost.size();
vector dp(n+1);
for (int i = 2; i <= n; i++)
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
return dp[n];
}
};
易错点
- 混淆“阶数”与“cost数组下标”:楼顶是第n阶,对应 dp[n] ,而 cost 数组仅到 cost[n-1] (第n-1阶的成本),需避免下标越界。
- 初始状态错误:部分人会将 dp[1] 设为 cost[0] ,但题目允许从第1阶直接起步,无需先爬第0阶,因此 dp[1] 应为0。
3. 746. 爬楼梯的变异:三步问题(waysToStep)
题目核心
求爬到n阶台阶的方法数,每次可爬1、2或3阶,结果需对 1e9+7 取模(防止溢出)。
解题思路
- 状态定义: dp[i] 表示爬到第i阶的总方法数。
- 递推逻辑:到达第i阶的路径来自前3阶(爬1阶到i、爬2阶到i、爬3阶到i),因此 dp[i] = dp[i-1] + dp[i-2] + dp[i-3] 。
- 边界处理: dp[1]=1 、 dp[2]=2 、 dp[3]=4 (直接枚举所有可能路径)。
- 溢出处理:n较大时(如n=1e6),结果会超出 int 范围,需用 long long 存储中间值,并每次计算后取模。
代码实现
class Solution {
public:
int waysToStep(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
if (n == 3) return 4;
long long a = 1, b = 2, c = 4;
long long d;
for (int i = 4; i <= n; ++i) {
d = (a + b + c) % 1000000007;
a = b;
b = c;
c = d;
}
return c;
}
};
易错点
- 未处理数值溢出: int 最大约2e9,当n≥30时,方法数会超过 int 范围,必须用 long long 存储中间变量,且每次计算后取模(而非最后取模,避免中间值溢出)。
- 边界值记忆错误:易将 dp[3] 误记为3(忽略“1+1+1”“1+2”“2+1”“3”四种路径),需准确枚举初始值。
4. 91. 解码方法
题目核心
将字符串 s (仅含数字)解码为字母(A=1,B=2,…,Z=26),求总解码方法数。
解题思路
- 状态定义: dp[i] 表示字符串前i个字符( s[0..i-1] )的解码方法数。
- 递推逻辑:分两种情况判断当前字符的解码方式:
1. 单个字符解码:若 s[i-1] != '0' (0无法单独解码),则 dp[i] += dp[i-1] (前i-1个字符的方法数可直接延续);
2. 两个字符解码:若前两个字符组成的数字 t 满足 10≤t≤26 (如“12”可解为L,“27”不可解),则 dp[i] += dp[i-2] (前i-2个字符的方法数延续)。
- 边界处理:
- dp[0] = 1 (空字符串有1种解码方式,作为递推基础);
- dp[1] = (s[0] != '0') ? 1 : 0 (单个字符若为0则无法解码)。
代码实现
class Solution {
public:
int numDecodings(string s) {
int n=s.size();
vectordp(n+1);
dp[0]=1; // 空字符串的解码方法数
dp[1]=s[0]!='0'; // 单个字符的解码情况
if(n==1)return dp[1];
for(int i=2;i=10&&t<=26)dp[i[i=dp[i-2];
}
return dp[n];
}
};
易错点
- 忽略“0”的特殊处理:
- 单个“0”无法解码,若 s[i-1] == '0' ,则不能用单个字符解码;
- 两个字符中,若前一个是“0”(如“06”),组成的数字是6,不满足 10≤t≤26 ,无法解码。
- 边界 dp[0] 的意义:新手易忽略 dp[0]=1 ,但当i=2且两个字符可解码时(如“12”), dp[2] = dp[1] + dp[0] , dp[0] 的1是“空字符串+两个字符”的解码方式基础。
- 字符串下标与 dp 下标错位: dp[i] 对应前i个字符( s[0] 到 s[i-1] ),计算两个字符时需取 s[i-2] 和 s[i-1] ,避免下标越界。
总结:动态规划的通用解题步骤
1. 定义状态:明确 dp[i] 代表的具体含义(如“到第i阶的方法数”“前i个字符的解码数”);
2. 推导递推公式:找到“当前状态与前几个状态的关系”(如泰波那契是前3项和,解码是单/双字符两种情况);
3. 处理边界条件:确定初始值(如 dp[0] 、 dp[1] ),避免递推起始错误;
4. 优化空间(可选):若递推仅依赖前k个状态(如泰波那契依赖前3个),可用变量代替数组,将空间复杂度从O(n)降至O(1);
5. 规避特殊情况:如数值溢出(取模、用 long long )、无效输入(如“0”“27”)。
掌握这四道题的思路,可轻松应对大部分基础DP问题,后续复杂DP(如二维DP、状态压缩)也能以此为基础扩展。
相关文章:
实用指南:经典动态规划题解
实用指南:经典动态规划题解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-si…...
2025杭电多校(2)
F https://acm.hdu.edu.cn/showproblem.php?pid=7996 题意 有两场比赛,统计对于每个 \(i\) ,有多少个人排在 \(i\) 的前面,需要去重。 思路 第一思路是统计每个位置 \(i\) 前面有多少人数,发现有个小容斥在这里,两场比赛排名前的总人数减去两场都在排名前的人数。 用树状…...
latex 打印生僻字
默认的字体格式很难打出生僻字. 我们可以使用ctex的其他字体. 首先要知道有哪些字体, 参考: https://www.cnblogs.com/wodedow/p/13845213.html. 比如我们要使用字体名称为AR PL KaitiM GB, 我们需要在usepackage区域加入下面的代码 \setCJKfamilyfont{font01}{AR PL KaitiM GB…...
CSP-S 2025 游记(The Last CSP ver.)
【洛谷专栏】。 前言 前作:CSP-S 2024 游记。 上一篇文章:2025 年南京大学计算机学科体验专题营 游记。 停课最早的一次,但是没有去年写的早,不过小问题。 与文化课告别的不突然,但仍有些不舍吧。也许未来不会再担任化学课代表了,化学老师真的对我很好(可怜。如果不是现…...
电机ADC采集
正点原直流有刷驱动板的硬件解说_直流有刷电机电流检测电路-CSDN博客电平移位电路设计(常用于将双极性的宽动态范围信号变成单极性窄动态范围的信号供ADC采集)-CSDN博客运放实现交流信号的放大与平移-CSDN博客...
道德经
1.道可道,非常道。名可名,非常名。无名天地之始;有名万物之母。2.天下皆知美之为美,斯恶已。皆知善之为善,斯不善已。3.有无相生,难易相成,长短相形,高下相盈,音声相和,前后相随。恒也。4.不尚贤,使民不争;不贵难得之货,使民不为盗;不见可欲,使民心不乱。是以圣…...
TokenFlow: Unified Image Tokenizer for Multimodal Understanding and Generation - jack
https://github.com/ByteVisionLab/TokenFlow https://arxiv.org/abs/2412.03069...
digitalworld.local: TORMENT - 实践
digitalworld.local: TORMENT - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important;…...
8.25-9.2周报六
1111...
Go by Example(3.Variables)
package mainimport "fmt"func main() {var a = "initial"fmt.Println(a)var b, c int = 1, 2fmt.Println(b, c)var d = truefmt.Println(d)var e intfmt.Println(e)f := "apple"fmt.Println(f) }运行结果: $ go run variables.go initial 1 2 …...
小程序分包方法
1、 图片上云 2、 删除不用的代码、函数和文件 3、 只有子包需要的接口移到子包中 4、 代码复用。效果不明显,实现两个页面复用一个大组件,可减少10kB大小 5、 还未实践见到效果的备选方案:把node_modules、uni_modules(在微信开发者工具的依赖分析看项目依赖这两个目录中的…...
9.3-9.10周报七
111111...
pyinstaller打包整个文件文件夹和相关exe,三方库
#打包目的:完全脱离环境,只copy hello.exe去其他机器就可以完美运行#打包命令: pyinstaller --onefile .\xxx\hello.py --hidden-import "tkinter" --hidden-import=glob --hidden-import=lxml --add-data ".\xxx\*;." --distpath output_dir --add-…...
学习心得
初次接触Hadoop时,我被其庞大的生态系统所震撼 学习过程中,我最大的感悟是理论与实践的结合至关重要。单纯阅读MapReduce的原理或HDFS的架构设计,总感觉隔着一层迷雾。直到亲手搭建环境、编写第一个WordCount程序,看到分布式计算如何将大任务拆解到多个节点并行处理,那种豁…...
Web前端入门第 87 问:JavaScript 中 setInterval 和 setTimeout 细节
setInterval 和 setTimeout 两者都是用于控制 JS 函数延迟执行,但是在执行机制和用途上还是有点儿差异。 虽然说两者功能上有区别,但在使用上却可以相互模拟各自的功能,大胆的猜测下:也许浏览器内核底层都是同一个方法,只是上层封装出的两个语法糖而已。 语法 两者在语法上…...
基于Python+Vue开发的农产品商城管理系统源码+运行
项目简介该项目是基于Python+Vue开发的农产品商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的农产品商城管理系统项目,大学生可以在实践中学…...
多人多次并发
在测试行业一年多,接触到多人多次并发首先创建线程组在JMeter中添加线程组,设置线程数、Ramp-Up时间和循环次数,然后添加HTTP请求:配置目标服务器的IP、端口和路径,模拟用户的具体操作。通过CSV Data Set Config加载用户数据,实现动态参数化。 查看结果树收集测试数据。合…...
B. Alternating Current
https://codeforces.com/problemset/problem/343/B 题意:给定两根线,告诉你每个节点的两根线的上下位置,问两根线能否无损解开 思路:如果连续的一段一个都在另一个上面或者下面,那么这一段就可以回到他本身的位置。根据这个思路,可以将问题转化为消消乐问题,只要有连续的…...
虚拟电厂运行机制
虚拟电厂(VPP)对电力资源的调节是其最核心、最精妙的功能。它本质上扮演着一个“全能电力调度员”的角色,但其调度对象不再是几个大电厂,而是成千上万个分散的、类型各异的分布式资源。 1. 察:全面感知与实时监测 这是调节的基础。虚拟电厂通过安装在各类终端资源上的智能…...
创建我第一个带记忆能力的langchain机器人
以下内容由AI对话生成带记忆的聊天机器人实现 下面是完整的代码实现,包含详细注释: # chatbot_with_memory.py import os from langchain_openai import ChatOpenAI from langchain.memory import ConversationBufferMemory from langchain.chains import ConversationChain …...
Reinforcing Image Generation with Collaborative Semantic-level and Token-level CoT - jack
https://arxiv.org/pdf/2505.00703 https://github.com/CaraJ7/T2I-R1...
GitHub超 30000+ star , 超强大的开源项目Supervision
Roboflow 的 Supervision 项目已于近期突破 30,000 个 GitHub Stars,是视觉工程师常用的辅助库,让你告别重复造轮子。 Supervision 是 Roboflow 出品、基于 MIT 协议的开源库,用于解决视觉项目中常见的可视化、跟踪、计数、格式转换等需求。可与 YOLO、Detectron2、Transfor…...
深入解析:【JavaEE】网络原理初识
深入解析:【JavaEE】网络原理初识pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; f…...
Office文档投毒技术:SHVE中的会话劫持视觉利用新突破
本文深入解析SHVE工具如何通过Office文档投毒技术,利用XSS漏洞和用户对可信网站的信任,在文档下载过程中自动注入恶意宏,实现隐蔽的攻击载荷交付,揭示了现代网络攻击中技术利用与心理信任结合的新型威胁模式。Office文档投毒在SHVE中的应用 大家好!我们带来了会话劫持视觉…...
爬虫逆向--Day22Day23--核心实战案例【荔枝网】【WASM学习】
案例地址链接:https://gdtv.cn/channels/2 案例爬取链接:https://gdtv-api.gdtv.cn/api/channel/v1/news?beginScore=0&channelId=246&pageSize=11 一、入口定位 首先当我们拿到网站,并且找到我们需要爬取的目标url以后,我们首先复制url到【https://curlconverter…...
简洁美观!一款值得 Star 的 Java 博客项目!
OneBlog —— 一个简洁美观、功能强大并且自适应的 Java 博客。基于 SpringBoot + Bootstrap 开发,支持移动端自适应,配有完备的前台和后台管理功能。大家好,我是 Java陈序员。 今天,给大家介绍一个简洁美观的开源 Java 博客系统。关注微信公众号:【Java陈序员】,获取开源…...
数据结构与算法-33.图-加权有向图最短路径
一、加权有向图 1、加权有向图 边的表示 代码实现 2、加权有向图的实现 二、最短路径 1、定义及性质 2、API设计 3、松弛技术4、Dijkstra算法实现 测试以上仅供参考,如有疑问,留言联系...
白子的情人节礼物
新题崭新出炉题面背景 我永远喜欢砂狼白子! ----MyShiroko 白子最近有点烦恼,因为她敏锐的嗅觉闻到了星野前辈身上有老师的味道。(详见《一日一星野》) 在多次询问星野无果的情况下,她打算直接去夏莱找老师问个清楚。 不过最近情人节快到了,白子决定拿着一些礼物,所以她…...
白子的情人节礼物 题解
咕咕点击查看代码 #include<bits/stdc++.h> #define int long long #define Blue_Archive return 0 #define con putchar( ) #define ent putchar(\n) using namespace std; constexpr int N = 5e5 + 7; constexpr int M = 8e5 + 7; constexpr int INF = 1e18;int n; in…...
Ubuntu上进行Zookeeper集群部署
Ubuntu系统上Zookeeper集群部署安装目录1.zookeeper下载2.zookeeper安装与使用3.zookeeper启动4.zookeeper是什么?为什么要用它?为什么不用Hbase自带的? 1.zookeeper下载 版本无特别要求,一般最新稳定版即可。 这里给出3.8.4的下载链接。(点击即可直接下载) zookeeper官网…...
The Landscape of Agentic Reinforcement Learning综述 - jack
The Landscape of Agentic Reinforcement__Learning for LLMs.pdf https://medium.com/data-science-in-your-pocket/the-landscape-of-agentic-reinforcement-learning-for-llms-a-survey-ed96182d3ed1...
A Survey of Reinforcement Learning for Large Reasoning Models - jack
https://arxiv.org/abs/2509.08827 https://huggingface.co/papers/2509.08827...
r-nacos支持mcp,内置mcp server支持让注册到r-nacos的普通http接口通过r-nacos直接转化成mcp服务对外提供服务。
r-nacos支持mcp,内置mcp server与接口转发;支持让注册到r-nacos的普通http接口通过r-nacos直接转化成mcp服务对外提供服务。r-nacos支持mcp,内置mcp server与接口转发;支持让注册到r-nacos的普通http接口通过r-nacos直接转化成mcp服务对外提供服务。 适用场景 如果你有一个…...
MacOS下微信小程序抓包教程
前言 换mac了,折腾一天抓包,终于成功抓上了。 BurpSuite下载: https://www.52pojie.cn/thread-2005151-1-1.html proifier下载:https://www.proxifier.com/ proifier注册机:https://github.com/y9nhjy/Proxifier-Keygen 一、安装proifier 先正常安装proifier本体,打开注册…...
nvm – nodejs版本管理工具
下载 Releases coreybutler/nvm-windows nvm-setup.exe nvm list available #查看可安装版本 如果报错Could not retrieve https://nodejs.org/dist/index.json: Get "https://nodejs.org/dist/index.json": dial tcp xxx.2x.xx.xxx:xxx: i/o timeoutnvm proxy http…...
财务系统里面,怎么合并使用两个经费本号
财务系统里面,怎么合并使用两个经费本号 把一个经费本号填好之后,正常填写,到提交的那个界面,不要提交。 一直点击 上一步, 到可以填写经费本号的那个界面。再填写第二个经费本号。点击下一步,再填写。最后提交即可。...
【火电机组、风能、储能】高比例风电电力系统储能运行及配置分析(Matlab代码实现) - 详解
【火电机组、风能、储能】高比例风电电力系统储能运行及配置分析(Matlab代码实现) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…...
新范式-LLaDA-VLA 基于扩散模型 VLA模型 - jack
https://mp.weixin.qq.com/s/fwOGuKy2Wtz_xXx3nCT28w 论文题目:LLaDA-VLA: Vision Language Diffusion Action Models 论文链接:https://arxiv.org/abs/2509.06932 项目主页:https://wenyuqing.github.io/llada-vla/ 论文时间:Sep, 8, 2025 作者单位:中科大,南京大学,原…...
Redis是如何进行内存管理的?缓存中有哪些常见问题?如何实现分布式锁?
Redis内存管理 Redis的内存用完了会怎样? 如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回)。 也可以配置内存淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。 Redis如何做内存优化? 可以好好利用Hash,list,sorted set,set等集合类型数据,…...
5 遥感与机器学习第三方库安装 - 详解
5 遥感与机器学习第三方库安装 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important…...
移远OPENCPU笔记
OPENCPU 支持的操作系统:Linux、ThreadX 芯片平台:国产ASRqq:505645074...
2025.9.16——1绿
普及+/提高 P3155 [CQOI2009] 叶子的染色 昨天用贪心写只拿了部分分,wpmx告诉我要用DP,但当时因为要赶作业没时间写。 今天补上了。...
Unity游戏开发:互动小游戏的技术实现与运营盈利之道
在数字化娱乐飞速发展的当下,互动小游戏凭借其独特的趣味性与强交互性,深受广大用户喜爱。从热闹非凡的线下活动,到流量庞大的线上平台,互动小游戏都展现出了强大的影响力与商业价值。在众多游戏开发引擎中,Unity以其卓越的性能和广泛的适用性,成为了互动小游戏开发的首选…...
如何实现主线程捕获子线程异常
一、基础概念...
LGP5688 [CSP-S-JX 2019] 散步 学习笔记
LGP5688 [CSP-S-JX 2019] 散步 学习笔记 Luogu Link 前言 一题多解这一块。 题意简述 \(n\) 个人在公园内散步。公园可以看作一个环形,上有 \(m\) 个出口,按逆时针顺序记作 \(1\) 号口到 \(m\) 号口。 环总长 \(V\) 米。记 \(a_i\) 为 \(i\) 号出口从 \(1\) 号口按逆时针走到…...
少儿练字控笔字帖
握笔和控笔是写好字的基础 准备了一些基本的控笔练习字帖少儿练字控笔字帖下载...
架构师必备:缓存更新模式总结
大家好,我是Java烘焙师。如何更新缓存和DB、做到性能和一致性的取舍,是一个很常见的话题。下面结合笔者的经验和思考,系统性地总结一下缓存更新模式,讲透讲明白。 1、旁路缓存(cache-aside) 实现方案查询:先查缓存,查不到缓存时再查DB,并把DB内容写入缓存、设置合适的…...
为什么不能在try-catch中捕获子线程的异常 ?
一、基础概念...
sensitive-word 敏感词性能提升14倍优化全过程 v0.28.0 - 实践
sensitive-word 敏感词性能提升14倍优化全过程 v0.28.0 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New"…...
2025 PHP 开发者必看得 25 个容易犯的常见错误 90% 的开发者都踩过
2025 PHP 开发者必看得 25 个容易犯的常见错误 90% 的开发者都踩过 前言 PHP 发展到今天,新特性层出不穷,最佳实践也在不断更新。写出干净、高效、好维护的代码,对每个 PHP 开发者来说都很重要。 这篇文章总结了 PHP 开发中最容易踩的坑,以及对应的解决方案。 不管你是刚入…...