当前位置: 首页 > article >正文

动态规划专练:力扣第509、70、746题

由于对动态规划DP算法 掌握得不是很好所以决定进行动态规划专项训练。动态规划五部曲①确定dp[i]含义②递推公式③dp数组如何初始化④遍历顺序⑤打印dp数组debug除了第五条在力扣上不开会员无法实现外其余四项就是做出dp类型题目的关键后续的训练中将按照这四步来进行解题。力扣第509题-斐波那契数1.本题的动态规划四部曲①dp[i]含义代表第i个斐波那契数的值。②递推公式题目中已经告诉我们了dp[i] dp[i – 1] dp[i – 2]。③初始化也在题目中dp[0] 0dp[1] 1。④遍历顺序从前向后2.本题是动态规划入门级题目可写出完整代码如下1. int fib(int n) { 2. int dp[31] {0}; 3. dp[0] 0; 4. dp[1] 1; 5. 6. if (n 2){ 7. for (int i 2; i n; i){ 8. dp[i] dp[i - 1] dp[i - 2]; 9. } 10. } 11. 12. return dp[n]; 13. }该算法时间复杂度为O(n)空间复杂度为O(n)。可以通过只保存当前遍历下标的前两个元素来将空间复杂度降为O(1)1. int fib(int n) { 2. int a 0; 3. int b 1; 4. if (n 0) return a; 5. if (n 1) return b; 6. 7. for (int i 2; i n; i){ 8. int tmp a; 9. a b; 10. b tmp; 11. } 12. 13. return b; 14. 15. }3.需要注意的是对于定义数组并赋值为0的代码1. int dp[10] {0}; // ✅ 完全正确 2. int n 5; 3. int dp[n 1]; // ✅ 定义可以 4. int dp[n 1] {0}; // ❌ 初始化 不可以固定长度的数组可以直接进行赋值为0的初始化而变长数组数组长度中含有变量只能进行定义不能进行赋值为0的初始化操作。4.本题也是递归类型题目的入门题所以用递归再写一遍1. int recursion(int n, int start, int a, int b){ 2. if (start n){ 3. return a b; 4. } 5. 6. int tmp a; 7. a b; 8. b tmp b; 9. return recursion(n, start 1, a, b); 10. } 11. 12. int fib(int n) { 13. if (n 0){ 14. return 0; 15. } 16. if (n 1){ 17. return 1; 18. } 19. 20. return recursion(n, 2, 0, 1); 21. }该算法时间复杂度为O(n)空间复杂度为O(1)。力扣第70题-爬楼梯1.本题的动态规划四部曲①dp[i]含义代表爬到第i层台阶的方法数。②递推公式爬到该层楼梯只能通过1步或者2步到达所以方法数等于前1层台阶的方法数与前2层台阶的方法数之和dp[i] dp[i – 1] dp[i – 2]。③初始化到达第1层有1种方法所以dp[1] 1而到达第二层有两种方法即1步1步到达与直接2步到达所以dp[2] dp[1] dp[0] 2初始化dp[0] 1。④遍历顺序从前向后2.基于以上思想可写出完整代码如下1. // 爬楼梯滚动变量迭代写法 —— 空间 O(1)最优解 2. int climbStairs(int n) { 3. // 定义两个滚动变量 4. // a 保存 dp[i-2] 的值前前台阶的方法数 5. int a 1; 6. // b 保存 dp[i-1] 的值前一台阶的方法数 7. int b 1; 8. 9. // 特殊情况n1直接返回 b只有1种方法 10. if (n 1) return b; 11. 12. // 从第 2 阶开始一直递推到第 n 阶 13. for (int i 2; i n; i){ 14. int tmp a; // 临时保存旧的 adp[i-2] 15. a b; // a 滚动更新变成 dp[i-1] 16. b tmp; // b 滚动更新新b 旧b 旧a → dp[i] dp[i-1]dp[i-2] 17. } 18. 19. // 循环结束后b 就是 dp[n]即答案 20. return b; 21. }该算法时间复杂度为O(n)空间复杂度为O(1)。力扣第746题-使用最小花费爬楼梯1.本题的动态规划四部曲①dp[i]含义因为从该层台阶向上跳才会收取费用所以本题dp[i]的含义为在第i层台阶向上跳所需要的最小花费。②递推公式爬到该层楼梯只能通过1步或者2步到达所以爬到本层的最小花费应该是爬到前两层的最少花费与本层花费之和dp[i] cost[i] fmin(dp[i - 1], dp[i - 2])。需要注意的是楼顶的下标为costSize而不是costSize – 1所以最后一次循环的时候需要使用的代码为dp[costSize] fmin(dp[costSize - 1], dp[costSize - 2])。③初始化dp[0] cost[0]dp[1] cost[1]相比于从0层爬到1层肯定是直接从1层出发花费更少。④遍历顺序从前向后2.基于以上思想可写出完整代码如下1. int minCostClimbingStairs(int* cost, int costSize) { 2. // 1. 定义dp数组 3. // dp[i] 到达第 i 个台阶时累计的最小花费 4. // 题目限制 costSize 1000所以开 1001 足够 5. int dp[1001] {0}; 6. 7. // 2. 初始化基准条件 8. // 可以从下标 0 或 1 开始爬所以 9. dp[0] cost[0]; // 到达第 0 阶的最小花费 cost[0] 10. dp[1] cost[1]; // 到达第 1 阶的最小花费 cost[1] 11. 12. // 3. 特殊情况只有 2 阶台阶时直接取两者最小值可以从0或1直接到顶 13. if (costSize 2) return fmin(dp[0], dp[1]); 14. 15. // 4. 递推计算从第 2 阶开始一直算到楼梯顶部第 costSize 阶 16. for (int i 2; i costSize; i){ 17. // 5. 特殊处理到达楼梯顶部i costSize 18. // 顶部不需要支付 cost所以直接取前两阶的最小值 19. if (i costSize){ 20. dp[i] fmin(dp[i - 1], dp[i - 2]); 21. } 22. // 6. 普通台阶到达第 i 阶的最小花费 cost[i] 前两阶的最小值 23. // 因为要到达 i 阶必须先付 cost[i]再从 i-1 或 i-2 阶爬上来 24. else { 25. dp[i] cost[i] fmin(dp[i - 1], dp[i - 2]); 26. } 27. } 28. 29. // 7. 最终答案到达楼梯顶部第 costSize 阶的最小花费 30. return dp[costSize]; 31. }该算法的时间复杂度和空间复杂度均为O(n)。3.实际上本题更符合题意、更清晰的做法应该是①dp的含义为到达该层台阶所需要的最小花费。②递推公式为dp[i] fmin(cost[i - 1] dp[i - 1], cost[i - 2] dp[i - 2])即要么从前1层跳上来要么从前2层跳上来最小花费为跳到前面那层的费用以及从那层起跳的费用。③初始化dp[0] 0dp[1] 0。这样做就不需要额外讨论costSize 2的边界情况。完整代码如下1. int minCostClimbingStairs(int* cost, int costSize) { 2. int dp[1001]; 3. 4. // dp[i] 到达第 i 级台阶还没往上跳时的最小花费 5. // 重点我们站在台阶上时还没支付这个台阶的费用 6. 7. dp[0] 0; // 站在第 0 级台阶不需要花费 8. dp[1] 0; // 站在第 1 级台阶不需要花费 9. 10. // 从第 2 级开始一直推到 顶部costSize 11. for (int i 2; i costSize; i){ 12. // 核心状态转移方程超级关键 13. // 到达第 i 级台阶有两种方法 14. // 1. 从 i-1 跳 1 步上来 → 花费 cost[i-1] dp[i-1] 15. // 2. 从 i-2 跳 2 步上来 → 花费 cost[i-2] dp[i-2] 16. // 取最小的那个 17. dp[i] fmin(cost[i - 1] dp[i - 1], cost[i - 2] dp[i - 2]); 18. } 19. 20. // dp[costSize] 就是到达楼梯顶部的最小花费 21. return dp[costSize]; 22. }

相关文章:

动态规划专练:力扣第509、70、746题

由于对动态规划DP算法 掌握得不是很好,所以决定进行动态规划专项训练。动态规划五部曲①确定dp[i]含义②递推公式③dp数组如何初始化④遍历顺序⑤打印dp数组(debug)除了第五条在力扣上不开会员无法实现外,其余四项就是做出dp类型题…...

UE4网络同步实战:AIController与RPC的避坑指南(含C++代码示例)

UE4网络同步实战:AIController与RPC的避坑指南(含C代码示例) 在多人联机游戏的开发中,网络同步始终是开发者面临的核心挑战之一。虚幻引擎4(UE4)提供了强大的网络框架,但其中AIController的服务…...

百度后端开发(Java)面试题精选:10道高频考题+答案解析

百度简介 百度是中国领先的互联网公司,以搜索引擎起家,现已发展成为涵盖人工智能、云计算、自动驾驶等多个领域的科技巨头。百度技术栈以Java为主,Spring生态为核心,在分布式系统、大数据处理、AI工程化方面有深厚积累。面试风格注重基础原理与工程实践结合,常考JVM调优、…...

10BASE-T1S PLCA参数配置避坑指南:从Node ID重复到Burst Timer设置,这些坑你踩过几个?

10BASE-T1S PLCA参数配置避坑指南:从Node ID重复到Burst Timer设置,这些坑你踩过几个? 在车载以太网的实际部署中,10BASE-T1S因其单对线缆实现多节点通信的特性,正逐渐成为智能座舱和传感器网络的热门选择。但当我们真…...

Z-Image-Turbo-rinaiqiao-huiyewunv 复杂场景生成挑战赛获奖作品赏析

Z-Image-Turbo-rinaiqiao-huiyewunv 复杂场景生成挑战赛获奖作品赏析 最近,我花了不少时间研究社区里的一场AI图像生成挑战赛,主题是“复杂场景生成”。参赛者们用的是一个叫Z-Image-Turbo-rinaiqiao-huiyewunv的模型,名字有点长&#xff0c…...

手把手教你用STM32CubeMX配置LCD1602显示:HAL库驱动移植+Proteus 8.12仿真

STM32CubeMX与Proteus联合开发:LCD1602显示实战指南 在嵌入式开发领域,STM32CubeMX和Proteus的组合为开发者提供了从硬件配置到软件仿真的完整解决方案。本文将深入探讨如何利用这两个工具链实现LCD1602液晶显示屏的驱动与显示功能,特别针对从…...

5G NR物理层实战:如何利用TS 38.211优化无线资源管理

5G NR物理层实战:TS 38.211无线资源管理优化指南 在5G网络部署的深水区,无线资源管理(RRM)的精细化程度直接决定了网络性能天花板。作为3GPP物理层协议集的核心文档,TS 38.211规范中隐藏着诸多未被充分挖掘的优化密钥—…...

如何用League-Toolkit实现英雄联盟游戏自动化:3个核心模块深度解析

如何用League-Toolkit实现英雄联盟游戏自动化:3个核心模块深度解析 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit Le…...

Revolut警告支持高耗能AI和加密货币业务可能面临声誉风险

英国银行应用Revolut表示,由于支持加密货币和AI等高耗能行业,公司可能面临声誉风险,同时该公司公布去年利润增长57%。这家金融科技公司在等待监管批准五年后,现在终于可以作为正式的英国银行启动业务。Revolut在其2025年年报中警告…...

终极免费逆向神器Ghidra:3分钟极速安装与新手入门指南

终极免费逆向神器Ghidra:3分钟极速安装与新手入门指南 【免费下载链接】ghidra_installer Helper scripts to set up OpenJDK 11 and scale Ghidra for 4K on Ubuntu 18.04 / 18.10 项目地址: https://gitcode.com/gh_mirrors/gh/ghidra_installer 还在为复杂…...

计算机毕业设计springboot研友帮系统设计与实现 基于SpringBoot的考研互助社区平台开发与实现 SpringBoot框架下研究生学术协作系统的设计与应用

计算机毕业设计springboot研友帮系统设计与实现w2zpm5oh (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着研究生招生规模的持续扩大,考研竞争日益激烈&#xff0…...

【实战指南】Spirent TCL 并发与新建连接测试全流程解析

1. Spirent TCL测试基础与环境搭建 第一次接触Spirent TestCenter时,我也被它强大的功能和复杂的界面吓到过。但实际用下来发现,只要掌握几个核心模块,就能完成大多数性能测试任务。这里先带大家快速搭建测试环境,为后续的并发和新…...

解决Windows端口转发难题:PortProxyGUI的可视化管理方案

解决Windows端口转发难题:PortProxyGUI的可视化管理方案 【免费下载链接】PortProxyGUI A manager of netsh interface portproxy which is to evaluate TCP/IP port redirect on windows. 项目地址: https://gitcode.com/gh_mirrors/po/PortProxyGUI 在网络…...

重塑前端图片处理流程:compressorjs的高效压缩技术突破之路

重塑前端图片处理流程:compressorjs的高效压缩技术突破之路 【免费下载链接】compressorjs compressorjs: 是一个JavaScript图像压缩库,使用浏览器原生的canvas.toBlob API进行图像压缩。 项目地址: https://gitcode.com/gh_mirrors/co/compressorjs …...

从猫狗识别到工业质检:深入理解PyTorch中的sample_weight,让模型更‘关注’关键样本

从猫狗识别到工业质检:深入理解PyTorch中的sample_weight,让模型更‘关注’关键样本 在工业质检和医疗影像分析中,某些样本的误判代价可能比其他样本高出一个数量级。想象一下,在半导体缺陷检测中漏判一个微小裂纹,或在…...

终极Illusion游戏Mod管理指南:用KKManager告别插件混乱

终极Illusion游戏Mod管理指南:用KKManager告别插件混乱 【免费下载链接】KKManager Mod, plugin and card manager for games by Illusion that use BepInEx 项目地址: https://gitcode.com/gh_mirrors/kk/KKManager 你是否曾经因为Mod冲突导致游戏崩溃而烦恼…...

ComfyUI-WanVideoWrapper:AI视频生成性能优化的终极指南

ComfyUI-WanVideoWrapper:AI视频生成性能优化的终极指南 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 在AI视频生成领域,显存限制和部署复杂性一直是开发者面临的核心挑…...

OpenClaw浏览器自动化:ollama-QwQ-32B模拟登录与数据抓取

OpenClaw浏览器自动化:ollama-QwQ-32B模拟登录与数据抓取 1. 为什么选择OpenClaw进行浏览器自动化 去年我在做一个社科研究项目时,需要从十几个政府公开数据平台定期抓取更新的统计报表。最初尝试用Python写爬虫,但遇到几个头疼的问题&…...

5大突破性功能:彻底革新StardewMods体验的核心增强工具

5大突破性功能:彻底革新StardewMods体验的核心增强工具 【免费下载链接】StardewMods Mods for Stardew Valley using SMAPI. 项目地址: https://gitcode.com/gh_mirrors/st/StardewMods 在星露谷物语的世界里,每位农场主都曾面临过重复劳作的枯燥…...

Llama-3.2V-11B-cot实战案例:金融财报图表理解与关键结论提取

Llama-3.2V-11B-cot实战案例:金融财报图表理解与关键结论提取 1. 项目概述 Llama-3.2V-11B-cot 是一款结合视觉理解和逻辑推理能力的先进模型,特别适合处理需要综合分析图像和文本信息的任务。在金融领域,它能够自动解读财报中的各类图表&a…...

HunyuanVideo-Foley参数详解:采样步数、CFG scale、音频采样率影响分析

HunyuanVideo-Foley参数详解:采样步数、CFG scale、音频采样率影响分析 1. 核心参数概述 HunyuanVideo-Foley作为一款集视频生成与音效生成于一体的AI模型,其输出质量与多个关键参数密切相关。本文将深入解析三个核心参数:采样步数&#xf…...

探索黑苹果安装实战:从零到完美的完全指南

探索黑苹果安装实战:从零到完美的完全指南 【免费下载链接】Hackintosh 国光的黑苹果安装教程:手把手教你配置 OpenCore 项目地址: https://gitcode.com/gh_mirrors/hac/Hackintosh 破解三大核心技术痛点 直面固件层兼容性障碍 当PC尝试运行mac…...

Axure RP中文语言包:3分钟快速汉化你的原型设计工具

Axure RP中文语言包:3分钟快速汉化你的原型设计工具 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包,不定期更新。支持 Axure 9、Axure 10。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 对于…...

SleeperX:Mac电源管理的智能守护者,让每一次工作都不被打断

SleeperX:Mac电源管理的智能守护者,让每一次工作都不被打断 【免费下载链接】SleeperX MacBook prevent idle/lid sleep! Hackintosh sleep on low battery capacity. 项目地址: https://gitcode.com/gh_mirrors/sl/SleeperX 您是否经历过这样的时…...

Python邮件自动化实战:基于imaplib和email库的高效邮件处理方案

1. Python邮件自动化处理的核心价值 每天早晨打开邮箱,看到堆积如山的未读邮件时,你是否感到头皮发麻?作为曾经每天要处理200封邮件的市场分析师,我完全理解这种痛苦。直到发现Python的imaplib和email这对黄金组合,我的…...

OpenOCD配置文件进阶指南:手把手教你定制STM32F0x的swj-dp.tcl脚本

OpenOCD深度定制:STM32F0x调试接口脚本开发实战 嵌入式开发中,调试工具的灵活配置往往决定着开发效率。对于STM32F0x系列芯片而言,OpenOCD作为开源调试工具链的核心组件,其配置文件的可定制性为开发者提供了极大的灵活性。本文将深…...

Qwen2.5-VL-7B-Instruct实战教程:如何将截图中的UI设计精准还原为可运行HTML+CSS

Qwen2.5-VL-7B-Instruct实战教程:如何将截图中的UI设计精准还原为可运行HTMLCSS 1. 工具简介与环境准备 Qwen2.5-VL-7B-Instruct是一个专门针对RTX 4090显卡优化的多模态大模型工具,它能看懂图片内容并生成相应的代码。想象一下,你只需要给…...

24小时运行实测:OpenClaw+nanobot自动化监控脚本稳定性报告

24小时运行实测:OpenClawnanobot自动化监控脚本稳定性报告 1. 为什么需要24小时自动化监控? 作为一名独立开发者,我经常遇到这样的困境:凌晨三点服务器突然宕机,等早上发现时已经损失了大量用户。传统监控工具要么太…...

终极ViGEmBus虚拟手柄驱动:Windows游戏控制解决方案完全指南

终极ViGEmBus虚拟手柄驱动:Windows游戏控制解决方案完全指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一款专业的Windows内核级…...

像素幻梦·创意工坊部署教程:Mac M1/M2芯片原生运行FLUX.1-dev像素生成

像素幻梦创意工坊部署教程:Mac M1/M2芯片原生运行FLUX.1-dev像素生成 1. 前言:认识像素幻梦创意工坊 像素幻梦创意工坊(Pixel Dream Workshop)是一款专为像素艺术创作设计的AI工具,基于最新的FLUX.1-dev扩散模型构建。与传统的AI绘图工具不…...