动态规划——做题五步法

动态规划从入门到精通(一)-入门篇 大三的春招,由于自己的不足,过得十分艰难。在各大公司的笔试题中,动态规划是一个必考点。突然冒出一个想法,写一个“动态规划从入门到精通”系列,与各大网友一起交流学习。 学习动态规划,愚认为,就是解决以下的三个问题: 什么是动态规划?什么时候要用动态规划?怎么使用动态规划? 让我们一个一个来解决! 1、什么是动态规划? 这里参考百度百科,动态规划是求解决策过程最优化的数学方法。把多阶段过程转... 阅读详情

前言

今天来看一下动态规划的题目,动态规划,也是经典算法的一种,更是面试常考的算法

究竟什么是动态规划算法呢,下面是DeepSeek选手给出的答案

定义

动态规划是一种 分阶段求解最优化问题 的算法思想,它通过 拆分问题、存储子问题的解(避免重复计算),最终递推得到全局最优解。 

核心思想

  • 分治思想:将大问题分解为相互重叠的子问题。

  • 记忆化存储:用数组(dp 表)记录子问题的解,避免重复计算。

  • 递推求解:通过状态转移方程,从小问题逐步推导大问题的解。

适用场景

动态规划适用于具有以下特征的问题:

  1. 最优子结构:问题的最优解包含子问题的最优解。
    (例如:最短路径的子路径也是最短的)

  2. 重叠子问题:子问题被重复计算多次。
    (例如:斐波那契数列中 fib(5) 依赖 fib(4) 和 fib(3),而 fib(4) 又依赖 fib(3))

今天我要向大家介绍的是做动态规划算法的基本五步(这里是借鉴b站上讲算法的大佬——代码随想录的想法,大家有空可以去看看人家的算法视频),先通过简单题理解如何运用五步法

到了后面的延申题就不至于毫无思路了

确定dp数组(dp table)以及下标的含义

确定递推公式

dp数组如何初始化

确定遍历顺序

举例推导dp数组

上面的dp数组也算是动态规划里的核心内容吧,就是用他来存储子问题的解

例题

斐波那契数

说了那么多还不如先看看具体题目,咱们具体题目具体分析

原来斐波那契数列也属于动态规划算法,我当初是用递归做的,也没想太多。

递归代码虽然简单,但是复杂度却不尽人意;

斐波那契数列_牛客题霸_牛客网

首先来看看上面的题,题意是求第n个斐波那契数

首先来看看什么是斐波那契数;

就是当n=1,2时,对应的值都是1,当n>2时,f(n)=f(n-1)+f(n-2)

所以会有

1 1 2 3 5 8 13 21

这些数就是斐波那契数

然后再看看上面的五步法

首先来看看第一步,确定dp数组以及下标的含义

这里求的是斐波那契数,那么dp数组自然是存放斐波那契数的,那么dp[i]就表示为第i个斐波那契数吧;

然后第二步,确定递推公式,其实也就是找规律,看看题目要求的数字有什么规律,这里题目已经给出了,当n>2时,满足f(n)=f(n-1)+f(n-2) 剩下的部分再单独处理

接着是第三步,dp数组如何初始化,那么我们知道,dp[i]表示的是第i个斐波那契数,dp[1]=1,dp[2]=1,那么dp[0]呢?

或许应该等于0,这样刚好就与性质对应上了,逻辑也说得通了

第四步,确定遍历顺序,因为动态规划有些题目会存在从后往前遍历的问题,所以这里也要考究一下遍历顺序的问题,这道题比较基础,值也是从小到大的,所以遍历顺序也是从小到大

第五步举例推导一下,这里我们写个伪代码,试试推导一下逻辑能否成立

vector<int> dp(n+1);
dp[0]=0;
dp[1]=1;
for(int i=2;i<n;i++)//由于0,1都已经做处理了,所以遍历从2开始
{
    dp[i]=dp[i-1]+dp[i-2]
}

假设n等于5

dp[3]=2,dp[4]=3,dp[5]=5

似乎和刚刚的手动推导的一样,那我们就把想法变成代码,试试能不能通过

这里正常通过了

时间复杂度是O(n),似乎还能再优化一下,感觉只维护两个值也行?

这里也是成功的把代码的时间复杂度降到了O(1)

跳台阶

跳台阶_牛客题霸_牛客网

想当初第一次看见这道题,竟毫无思路,现在才知道要先分析一下数据

我们先来看看,这似乎也是斐波那契数列

跳的台阶数       跳法
    1            1
    2            2    
    3            3
    4            5
    5            8

那就简单了  dp数组存放的是跳台阶时可能有的跳法,dp[i]则表示的是第i层台阶总共有的跳法

递推公式也简单 满足f(n)=f(n-1)+f(n-2)就行

初始化的话,由于不存在第0层,直接考虑第一层和第二层

dp[1]=1
dp[2]=2

遍历顺序也是从小到大

最后写个伪代码,简单推导一下

vector<int> dp(n+1)
dp[1]=1;
dp[2]=2;
for(int i=3;i<=n;i++)
{
    dp[i]=dp[i-1]+dp[i-2]
}

假如是3层台阶

跳一遍一层,跳一遍两层

跳三遍一层

跳一遍两层,跳一遍一层

刚好是三次,现在验证一下思路

刚好过了

还可以和上面一样,优化一下思路

一文读懂动态规划问题 动态规划,英文: Dynamic Programming, 简称DP,如果某一个问题由很多重叠子问题,使用动态规划是最有效的。所谓动态规划就是,在解决一个问题的过程中,将其分解为很多个小的部分,环环相扣。最典型的一个例子,我们入门编程时都学习过的斐波那契数,每个数都是由前面的两个数字推导出来的,也就是所谓的前一个状态。 阅读详情

相关推荐

三大算法之二:万字详解动态规划(五步法彻底解决动态规划问题)

1.由斐波那契数列引入 1.斐波那契数列 1,1,2,3,5,8…… 每一个数是它的前两个数的和,我们需要求解第n个数是多少。 2.正常思路 我们在编写斐波那契数列时,通常会这样来写程序: T(n)=1 n=1 =1 n=2 =T(n-1)+T(n-2) n>2 你可能会说多么完美,简单易懂而且代码量极少,但其实这是斐波那契数列计算第n个值的所用运行时间最长的一个程序。 虽然这里运用了分治法的思想,但仍然不是这个问题的最优解。 3.分治法的两种形...

分享学习的知识,记录我的技术成长道路 3141

动态规划的五部曲

/只分析第i个的状态,(i-2)的次数跳两阶楼梯加上(i-1)的次数跳一阶楼梯就是跳到i的楼梯的次数。都说动态规划最重要的是找到动态转移方程,其实初始化也同样重要,没有一个好的初始化,后面的dp也很难进行。动态规划是运筹学的一个分支,是求解决策过程最优化的过程。//dp[i]的含义是到达第i阶楼梯的次数。因为动态转移方程很简单 初始化很简单 遍历顺序也很简单所以这个题很简单。毕竟是初讲,我就来讲讲动态规划的入门,菲布拉契数列。

2301_80659977的博客 553

动态规划之【线性DP】第1课:通过爬楼梯案例理解动态规划的解题框架:“DP四步法”

动态规划之【线性DP】第1课:通过爬楼梯案例理解动态规划的解题框架:“DP四步法”

王老师青少年编程 1451

【数据结构与算法】动态规划法解题20240228

如何初始化呢,首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。这样就可以保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值的。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人从(0 , 0) 位置出发,到(m - 1, n - 1)终点。1、确定dp数组(dp table)以及下标的含义。1、确定dp数组(dp table)以及下标的含义。

python全栈 1111

Infinite-Canvas:一站式AI绘画工作流平台部署与实战指南

在 AI 绘画和内容创作领域,你是否经常遇到这样的困扰:灵感来了,却要在多个工具间来回切换——找素材、写提示词、调整参数、批量生成,整个过程繁琐且低效。创作一个系列作品时,管理不同版本的图片和提示词更是让人头疼。如果你渴望一个能整合所有流程,实现从素材管理、提示词工程到批量出图一站式完成的工作台,那么今天介绍的 Infinite-Canvas 正是为你量身打造的解决方案。 Infinite-Canvas 是一个开源的本地网页应用,它将 AI 绘画的完整工作流集成在一个界面中。无论你是想快速生成单张图片,还是

weixin_28707535的博客 338

别再折腾Windows了!Ubuntu 22.04下USRP X310 + RFNoC + Vivado 2021.1开发环境保姆级搭建指南

本文提供Ubuntu 22.04下USRP X310 + RFNoC + Vivado 2021.1开发环境的详细搭建指南,涵盖系统优化、UHD驱动编译、Vivado配置及硬件验证等关键步骤,帮助射频工程师高效构建稳定的开发环境,显著提升FPGA开发效率。

weixin_29168675的博客 255

算法训练——动态规划算法

本博文主要介绍动态规划算法问题已经怎么样熟悉相关算法。对动态规划问题进行总结,提供给大家思考和复习。

庄小焱 670

在MATLAB产生正态(Gauss)分布随机数

在 MATLAB 中内置了有产生标准正态(Gauss)分布的随机数函数,使用方法如下: 其中 为产生矩阵的行数和列数, 为产生矩阵的个数,产生的矩阵中的每个元素均为服从 N(0,1)N(0, 1)N(0,1) 的标准正态分布的元素。使用如下命令产生一个 的服从的随机数矩阵: 绘制图像效果如下: 可以看到这里随机数服从 的标准正态分布。假设 X∼N(0,1)X\sim N(0,1)X∼N(0,1),则 3X+33X+33X+3 服从 N(3,9)N(3,9)N(3,9) 分布,因此我们要产生服从 N(

程序必须为人类阅读而编写,并且仅仅碰巧可以让机器执行 3万+

【动态规划】-【理论基础】-动态规划简要介绍及五步曲

重点:最优子结构,重叠子问题,五步曲 目录 1. 动态规划题型 2. 什么是动态规划 3. 动态规划的解题步骤 1. 动态规划题型 总的来说,动态规划有如下几类题型: (1)基础题目:如斐波那契数,爬楼梯,不同路径,整数拆分等; (2)背包问题:01背包,完全背包,多重背包等; (3)打家劫舍问题: (4)投票问题:只能买卖一次,可以买卖若干次等; (5)子序列问题:连续,不连续,编辑距离等; 2. 什么是动态规划 动态规划(Dynamic Programming),简称DP,

杨的博客 430

高分影像批处理第三回——RPC文件与几何校正

前言 前面两章部分完成了图像的基本组织和大气校正,可是对于遥感影像地理相关数据,精确的地理坐标也是非常关键的。L1级数据,可惜,并没有帮我们处理地理坐标系统。无论是打开ENVI还是用gdal工具查看图像元数据,其坐标系统都是错误的或者说是未读入的。因此本章节来解决这个问题。

weixin_43762038的博客 1万+

ROS专栏—基于STM32F103的INA219电源数据采集

文章主要记录了stm32f103对ina219的数据采集

热爱生活、奋斗前行 2353

LeetCode动态规划完全背包问题——377.组合总和IV

377. 组合总和 Ⅳhttps://leetcode.cn/problems/combination-sum-iv/给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。 牢记动态规划五步:1.确定dp数组含义2.确定递推公式3.dp数组初始化4.确定遍历顺序5.举列推导 动态规划做题方法: 做动规题目的时候,很多同学会陷入一个误区,就是以为把状态转移公式背下来,

w20001118的博客 497

Python实战:5分钟搞定N-CMAPSS航空发动机数据集解析(附完整代码)

本文提供了一份针对N-CMAPSS航空发动机数据集的快速解析实战指南。通过Python的h5py库,详细演示了如何读取HDF5文件结构、理解数据分类(如传感器、健康参数、场景描述符)并加载为Pandas DataFrame。文章还澄清了数据集中常见的变量数量疑惑,并给出了从数据加载到构建剩余使用寿命预测模型预处理流水线的完整代码,帮助工程师和研究人员高效入门航空发动机预测性维护分析。

weixin_29057065的博客 422

代码随想录算法笔记:从刷题顺序到实战复盘的系统备战指南

算法学习常常陷入题海战术的低效循环,理解底层数据结构与算法原理才是突破的关键。从数组、链表到二叉树、图论,每个专题都遵循依赖关系,系统化建立知识框架,能显著提升刷题效率。动态规划等高频难点,需要掌握状态定义、递推公式等核心方法,而非盲目堆砌题量。无论是准备算法面试、转码冲刺,还是日常编程实践,一份按专题递进、带复杂度分析和复盘机制的笔记,都能帮助学习者从“看懂题解”进阶到“独立AC”。本文以代码随想录算法笔记为例,分享主线+支线的刷题顺序、五步做题法及滚动复习策略,为系统备战算法面试提供可落地的参考。

weixin_29574585的博客 310

【科研数据获取】根据Excel表个中的企业/公司信息批量获取经纬度坐标,并进行地图可视化

批量获取企业/公司的经纬度坐标,并进行地图可视化1 需求2 实现途径3 需求逐步实现 1 需求 在做项目的时候,老板或者项目答辩时候甲方最喜欢看到的就是可视化结果,尤其是涉及到地图可视化。很多时候会遇到企业/公司的数据,想要做地图可视化,必不可少的就是要获取它们具体地址:第一种就是像查户口一样精准一下具体的城镇街道,还有一种就是经纬度信息,前一种属于文字内容往往用于管理方面,第二种数字信息多用于数据处理与分析。 2 实现途径 获取地理信息数据,自然需要使用到地图的功能,这里直接采用百度地图的拾取坐标系统,

lys_828的博客 2336

FPGA原理与结构(3)——存储单元(Storage Elements)

触发器,锁存器,寄存器,为什么xilinx推荐高电平复位,为什么latch依然存在,FPGA中的触发器与锁存器

apple_53311083的博客 2961

算法篇----动态规划

背包问题是动态规划中的经典模型。基本描述:有 n 件物品,每件物品有体积 v[i] 和价值 w[i]。有一个容量为 V 的背包。问如何选择物品,使总价值最大。类型特点01 背包每件物品只能选 1 次完全背包每件物品可以选无限次多重背包每件物品有数量限制分组背包每组只能选一个。

2401_85878549的博客 200

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Python编程100+题实战训练:从基础语法到算法面试全攻略

在编程学习过程中,理论知识往往容易掌握,但实际动手写代码才是检验能力的唯一标准。Python作为一种简洁易读的编程语言,其应用范围涵盖数据分析、Web开发、自动化脚本等多个领域。然而,从看懂语法到熟练编写程序,中间需要大量刻意练习。编程练习题正是连接基础知识与工程实战的桥梁,通过覆盖变量、流程控制、函数、数据结构、文件处理、正则、面向对象及算法入门等核心模块,能够帮助学习者逐步建立编程思维。无论是零基础转行、高校课程巩固,还是校招笔试准备,系统化的Python编程题集都能提供清晰的训练路径。本文整理了一套包

weixin_32175665的博客 196

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【LeetCode算法题精讲】动态规划入门:“DP 五步法“方法论精讲

本文介绍了动态规划(DP)的入门方法论,通过LeetCode 70爬楼梯和198打家劫舍两道经典题目,系统讲解了DP五步法:定义dp数组、确定递推公式、初始化、遍历顺序和验证。文章对比了计数型DP和最值型DP的区别,展示了从O(n)空间到O(1)滚动优化的技巧,并比较了记忆化递归与自底向上DP的优劣。最后以746最小花费爬楼梯为例,演示如何用同一框架解决变体问题。

2401_88352165的博客 672

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

动态规划五步法:从基础概念到实战技巧

动态规划(DP)是解决最优化问题的核心算法思想,通过记忆化存储和状态转移实现高效计算。其核心原理是将复杂问题分解为重叠子问题,适用于求最值、方案计数等场景。在工程实践中,DP通过五步法(定义状态、建立方程、初始化、遍历顺序、验证)系统化解决问题,典型应用包括斐波那契数列、背包问题等。掌握DP需要理解状态设计和空间优化技巧,如滚动数组降维。本文结合爬楼梯、01背包等经典案例,详解如何避免数组越界、错误初始化等常见问题,并分享打印DP表、手动验证等调试方法。

weixin_33428613的博客 215

AlgoNote 算法通关手册:LeetCode 343 整数拆分——动态规划五步法经典题解

**导读**:本文以「算法通关手册」AlgoNote 仓库中 [0343. 整数拆分](https://link.gitcode.com/i/ec70ead8451c5f5beb20a39737c0ba88) 的官方题解为主体,系统讲解这道中等难度动态规划题的完整推导过程:从问题建模、状态定义到状态转移方程与代码实现。该题同时被仓库收录于「无串线性 DP」专题,是学习线性动态规划最典型的入门题目之

gitblog_00820的博客 174

动态规划核心思想与五步法:从最优子结构到背包问题实战

动态规划(Dynamic Programming)是一种通过空间换时间来解决具有重叠子问题和最优子结构特性的高效算法。其核心原理在于将复杂问题分解为相互重叠的子问题,并存储子问题的解以避免重复计算,从而将指数级时间复杂度优化为多项式级。在技术价值上,动态规划是解决最优化问题的关键技术,广泛应用于资源分配、路径规划、序列比对等领域。例如,在经典的0-1背包问题中,通过定义状态数组和状态转移方程,可以高效求解在容量限制下的最大价值问题。本文以最优子结构和重叠子问题为切入点,深入剖析动态规划的五步解题法,并结合背

weixin_33423874的博客 331

动态规划五步法:从爬楼梯到背包问题的完整指南

动态规划是算法领域中将复杂问题拆解为重叠子问题并利用状态存储避免重复计算的核心思想。其成立依赖最优子结构与重叠子问题两大特征:父问题的最优解由子问题最优解组合而成,且同一子问题会被多次复用。通过状态定义、转移方程、初始化与遍历顺序的设计,动态规划能把指数级暴力递归优化为多项式级求解,在路径规划、资源分配等领域广泛应用。从一维的爬楼梯计数,到二维网格不同路径,再到0-1背包价值最大化,掌握递推关系的构建与滚动数组的空间压缩技巧,是算法工程落地中的关键基本功。本文以经典例题逐步拆解动态规划五步法,帮助读者建立从

weixin_31102231的博客 222

算法面试核心:从数列递推理解动态规划五步法

动态规划是算法设计的核心思想之一,其本质是通过定义状态和状态转移方程,将复杂问题分解为重叠子问题来高效求解。其核心原理在于利用最优子结构和重叠子问题性质,避免重复计算,从而在多项式时间内找到问题的最优解。这一技术在工程实践中价值巨大,广泛应用于资源优化、路径规划、序列决策等场景。本文以经典的爬楼梯问题为例,系统拆解了将实际问题抽象为数列递推的完整流程,并深入剖析了从暴力递归到记忆化搜索,再到动态规划及空间优化的完整优化链条。通过掌握定义状态、建立递推、确定边界、选择顺序和空间优化这五步方法论,读者可以建立起

weixin_26869081的博客 349

代码随想录刷LeetCode | day39 动态规划刷题回顾

按照步骤想出了递推公式,但如何初始化却迷糊。动态规划初始化,并不需要全部都初始化,只要能刚开始迭代时需要的值初始化即可,并且这样的值都是具有较明显的特点,就像这道题的两边初始化都为1一样。

weixin_40142386的博客 461

动态规划问题五步法

状态就是dp数组的含义# 一维DPdp[i] = 到达位置i的xxxdp[i] = 前i个元素的xxxdp[i] = 长度为i的xxx# 二维DPdp[i][j] = 前i个物品,容量为j的xxxdp[i][j] = 到达(i,j)位置的xxx。

m0_53271604的博客 328
上一篇: 全排列大杂烩——回溯算法
下一篇: C语言常见关键字和define
宴之敖者、
博客等级 码龄4年 131粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值