动态规划及其动态规划经典例题

动态规划经典例题汇总 (附最全题目链接) 本文总结了王道机试指南中动态规划(Dynamic Progamming)部分的所有例题。 一.基本思想 与分治法类似,其基本思想也是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解中得到原问题的解。 与分治法不同的是,分治法会使得有些子问题被重复计算多次。而动态规划的做法是将已解决子问题的答案保存下来,在需要子问题答案的时候便可直接获得,而不需要重复计算,节约效率。 二.经典题目 ... 阅读详情

引言:

动态规划是最重要、最经典的算法之一,学好动态规划对我们十分重要,掌握动态规划对解决某些问题会起到事半功倍的效果。

动态规划:

特点:
①可以把原始问题划分为一系列子问题
②求解每个子问题仅一次,并将其结果保存到一个表中,以后用到时直接存取,不重复计算,节省时间。
③自底向上地计算
适用范围:
原问题可以分为多个相关子问题,子问题的解会被重复使用。

动态规划的关键点:

动态规划和递归或者分治没有根本上的区别(关键看有无最优子结构)。
**共性:**找到重复子问题
**差异性:**最优子结构、中途可以淘汰次优解。

动态规划题目的特点:

1.计数
-有多少种方式走到右下角
-有多少种方法选出k个数的和为sum

2.求最大最小值
-从左上角到右下角路径的最大数字和
-最长上升子序列长度
3.求存在性
-取石子游戏,先手是否必胜
-能不能选出k个数使得和是sum

下面我会用一些力扣上的动态规划经典例题来解释动态规划的用法。请大家将题目和上面的问题特点对号入座。

题目1:零钱兑换
题目链接
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

在这里插入图片描述
题解:
这道题可以从前往后推,如果目标钱数是0,凑成总金额所需的最少的硬币个数是多少;
目标是1,会怎样呢,…直到目标钱数为amount,需要的最少硬币又是多少呢?
首先要看最后一步,最后一步肯定是dp[i]置为dp[i-coins[j]]+1中最小的那个。所以转换为正推,
如果无法凑够则先把硬币数dp[i]置为最大INT_MAX;否则,则把dp[i]置为最小的dp[i-coins[j]]+1.
然后最后判断一下,如果dp[amount]是否为INT_MAX,如果是,说明无法凑齐,返回-1,如果不是,说明dp[amount]就是最少硬币数。
重要的就是转移方程:dp[i]=min(dp[i],dp[i-coins[j]]+1);

代码:

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int dp[amount+1];//因为下面dp[i]=INT_MAX,如果再加1,就会超过范围
        dp[0]=0;
        int i,j;
        for(i=1;i<=amount;i++)
        {
            dp[i]=INT_MAX-10000;
            for(j=0;j<coins.size();j++)
            {
                if(i>=coins[j])
                {
                    dp[i]=min(dp[i],dp[i-coins[j]]+1);
                }
            }
        }
        return dp[amount]==INT_MAX?-1:dp[amount];
    }
};

题目2:不同路径
题目链接
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
在这里插入图片描述
在这里插入图片描述
题解:
我们首先看最后一步,要想到达(m,n)首先要到达(m-1,n)或者(m,n-1)。设到达(m-1,n)路径有x种,到达(m,n-1)路径有y种,则到达(m,n)的路径有x+y种。
然后再从头看起,到达(1,2)路径只有1种,到达(2,1)路径只有1种,到达(i,j)的路径数是到达(i-1,j)和(i,j-1)的路径和。
重点:转移方程:dp[i][j]=dp[i-1][j]+dp[i][j-1];

代码:

class Solution {
public:
    
    int uniquePaths(int m, int n) {
        int dp[m][n];
        int i,j;
        dp[0][0]=0;
        for(i=0;i<m;i++)
        {
            for(j=0;j<n;j++)
            {
                if(i==0||j==0)
                {
                    dp[i][j]=1;
                }
                else
                {
                    dp[i][j]=dp[i-1][j]+dp[i][j-1];
                }
            }
        }
        return dp[m-1][n-1];
    }
};

题目3:跳跃游戏
题目链接
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。
在这里插入图片描述
题解:
我们首先从后面看,要想到达下标为n-1的地方,有两个条件:①能到达下标为 i 的地方;②从 i 能调到 j 。所以我们就得到了转移方程:if(dp[j]&&j+nums[j]>=i) dp[j]=true;
然后我们再从头遍历,判断每个下标为 i 的地方算法能调到,最后返回dp[n-1]即可。

代码:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int i,j;
        bool dp[nums.size()];
        dp[0]=true;
        for(i=1;i<nums.size();i++)
        {
            dp[i]=false;
            for(j=0;j<i;j++)
            {
                if(dp[j]&&j+nums[j]>=i)
                {
                    dp[i]=true;
                    break;
                }
            }
        }
        return dp[nums.size()-1];
    }
};

题目4:背包问题

因为背包问题比较重要,所以我单独把背包问题拿出来单独写一篇博客。
传送门

题目5:最大子列和
题目链接
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

在这里插入图片描述
题解:
如果数组中只有1个数,那么最大子列和就是该数值。如果大于1个,依次遍历数组,如果没考虑当前数的时候,最大子列和小于0,那么考虑到这个数时最大子列和就是该数值;如果没考虑当前数的时候,最大子列和小于0,那么考虑到这个数时最大子列和就是该数值加上之前的最大子列和。然后从这些子列和中选出最大的即可。(可以直接看代码,代码通俗易懂.)

代码:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
    int dp[nums.size()];
    int i;
    dp[0]=nums[0];
    int maxSum=dp[0];
    for(i=1;i<nums.size();i++)
    {
        dp[i]=max(dp[i-1],0)+nums[i];
        maxSum=maxSum>dp[i]?maxSum:dp[i];
    }
    return maxSum;
    }
};

动态规划总结:

在这里插入图片描述

最长上升子序列 (LIS) 详解+例题模板 (全) 欢迎访问https://blog.youkuaiyun.com/lxt_Lucia~~ 宇宙第一小仙女\(^o^)/~~萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗~~ ------------------------------------我只是一条可爱哒分界线-------------------------------------- 1.摘要: 关... 阅读详情

相关推荐

MDK5 Debug调试方法总结

MDK5 Debug调试方法总结

m0_70748084的博客 2万+

【数据结构与算法-动态规划系列经典例题汇总】

【数据结构与算法-动态规划系列经典例题汇总】典例1、爬楼梯(easy)典例2、打劫(easy)典例3、最大字段和(easy)典例4、找零钱(medium)典例5、三角形(medium)典例6、最长上升子序列(medium)典例7、最小路径和(medium)典例8、地下城游戏(hard) 典例1、爬楼梯(easy) 题目描述: 思路: LeetCode提交OJ测试链接: OJ测试代码实现: 可本地运行测试的完整代码: 典例2、打劫(easy) 题目描述: 思路:

是小武呀 1万+

MiniMax H3本地部署与ComfyUI集成实战:从环境配置到提示词优化

文本到视频生成是AI内容创作领域的关键技术,它基于扩散模型等深度学习原理,将自然语言描述转化为连贯的动态视觉序列。这项技术的核心价值在于大幅降低了视频制作的门槛,为短视频创作、概念可视化、教育内容生成等场景提供了高效工具。在实际工程实践中,成功部署和运行此类模型,如近期备受关注的MiniMax H3,需要精准处理环境配置、显存优化和提示词工程等环节。其中,解决“CUDA error: no kernel image is available”等版本兼容性问题,以及针对“8G显存”等有限资源进行参数调优,是确

weixin_33674976的博客 479

动态规划算法与典型例题

动态规划算法设计思路与一些典型例题,如长江游艇问题,0-1背包问题,跳台阶问题,强盗抢劫问题等

weixin_50431732的博客 1万+

解决Android UVCCamera stopPreview 报错 崩溃 闪退 问题

在使用libuvccamera库的UVCCamera时,经常在调用stopPreview关闭预览的时候,app直接崩溃闪退了,经过综合各种修改源码的方案,已解决这个问题,以下请参考: 首先找到android_usbfs.c,linux_usbfs.c两个原文件,在两个文件中都可以找到这段代码,按如下示例修改: 修改前: for (i = 0; i < num_urbs; i++) { if (urb == tpriv->iso_urbs[i]) { urb_idx = i + 1;

hanye2020的博客 3576

[PCIE5.0] 4.2.3.2 Encoding of Presets

• 发射器预设:发射器预设值用4位二进制编码,表示不同的预设设置(P0 到 P10),这些设置定义了信号的传输特性。• 接收器预设提示:接收器预设提示是通过3位二进制编码告诉接收器建议的增益值,用于调整接收器的灵敏度(适用于8.0 GT/s数据速率)。

系统固件工程师 575

算法:[动态规划]简单多状态

这道题的要求就是选择一个数 x 后,不能选择值为 x - 1 和 x + 1 的数了,如果有一个连续的数,例如 1 2 3 4,选了1,就不能选2,只能选3/4,这就和上面的按摩师的题目是一样的了,都是选择一个数,不能选择与其相连的。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。因为填 i 位置时,需要选 i - 1 位置的另外两个颜色的最小值,又因为是填第一个位置的值,所以为了不影响后续结果,将前面0位置全部初始化为0,这样就不会影响结果,在填dp[i][1]时,就只会取它本身的值。

一名还在努力学习技术的程序员的博客 1830

【Claude Code 实战】第十章:DevOps 与 CI/CD 集成 / 光子AI

本章摘要:探讨Claude Code在DevOps与CI/CD集成中的应用。DevOps作为现代软件工程核心,结合AI技术实现自动化全流程,从代码提交到生产部署。通过CALMS模型(文化、自动化、精益、度量、分享)解析DevOps理念,对比传统瀑布模式与DevOps模式差异,展示AI如何加速Dockerfile编写、CI/CD配置等任务。典型示例显示AI可将原本30-60分钟的手动配置缩短至1-2分钟,大幅提升DevOps效率。

AI天才研究院 367

动态规划题目汇总(持续更新)

动态规划题目汇总(持续更新)

weixin_43954951的博客 5964

详解RT-DETR网络结构/数据集获取/环境搭建/训练/推理/验证/导出/部署

本文给大家带来是利用RT-DETR模训练自己的数据集,RT-DETR是一种新提出的目标检测模型,它利用的自注意力机制来处理图像数据。不同于YOLO通过连续的卷积层直接对图像区域进行分析,RT-DETR采用Transformer架构中的自注意力机制,这允许模型更有效地理解图像中不同部分之间的关系。这种方法使得RT-DETR在处理图像中的复杂场景和多对象环境时,能够展现出更高的准确性和效率。此外,RT-DETR在保持高精度的同时,也针对实时处理进行了优化,使其适合需要快速响应的应用场景。

Snu77的博客 6万+

通信原理 | 随机数仿真 | 均匀、正态、双高斯、瑞利、莱斯、对数正态、nakagami、Suzuki分布的随机数仿真(matlab)

信道建模在通信系统设计和分析中扮演着至关重要的角色。它指的是使用数学和物理模型来描述和模拟无线或有线通信路径中的信号传播特性。

若北辰 1988

【蓝桥杯】备战系列之基础篇--动态规划思想及其经典例题

当一个问题可以分解为各种不同的子问题的时候,我们可以一步一步求子问题的解,最后再求原问题。 1,如何用动态规划做题:(思路) 做有关动态规划的题是分为两步: (1)状态表示 什么意思呢?就是说首先需要判断该DP问题是一维还是二维,假设是二维,设为f[i][j],这时需要明确状态数组f表示的是什么。首先要看题目,题目问的啥就是什么,然后看该集合表示的是什么属性,比如是最大值,最小值,还是种数或者个数等。 (2)状态计算 首先需要看所有方案的集合该如何划分,这里有个标准就是说看最后一个不同点。

qq_51502732的博客 414

西门子S7-1200PLC控制步进电机的组态编程和具体步骤

西门子S7-1200PLC控制步进电机的组态编程和具体步骤 硬件准备: 1) 一个S7-1214C DC/DC/DC,订货号:6ES7 214-1AG40-0XB0 2) 一个86系的步进电机+相应的驱动器 3) 一个20A的西门子24V电源(步进驱动器及plc电源) 4) Portal V15版本 组态及编程: 1) 创建一个验证项目,添加cpu( S7-1214C),双击“工艺对象”,选择“运动控制”的TO_PositioningAxis V6.0版本,如下图所示: 2) “确定”后,系统自动生成名

Robot_PLC_HMI_Automation 1万+

动态规划总结——通过例题疏通你

动态规划 多阶段决策的过程:每一步求解的问题是后面阶段求解问题的子问题,每一步决策都将依赖于以前决策的结果 优化函数值之间存在依赖关系 优化函数的特点:任何最短路的子路径相对于子问题始、终点最短 一定要存在依赖关系! 一定要满足优化原则或最优子结构性质 设计要素 多阶段决策过程,每步处理一个子问题,界定子问题的边界 列出优化函数的递推方程以及初值 问题满足优化原则或最优子结构性质。一个最优决策序列...

Mereder的博客 591

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

区间动态规划

区间 DP是指在一段区间上进行的一系列动态规划。 对于区间 DP 这一类问题,我们需要计算区间 [1,n] 的答案,通常用一个二维数组 dp 表示,其中 dp[x][y] 表示区间 [x,y]。 有些题目,dp[l][r] 由 dp[l][r−1] 与 dp[l+1][r] 推得;也有些题目,我们需要枚举区间 [l,r] 内的中间点,由两个子问题合并得到,也可以说 dp[l][r] 由 ...

dianyi2475的博客 330

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

初探动态规划(DP)

学习qzz的命名,来写一篇关于动态规划(dp)的入门博客。 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比。 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门动态规划的真正意义。 奶萌兔的温馨提示:建议先理解dfs哦~(本文以一种较为新奇的方式解释DP) 动态规划 那什么是动态规划? 来问问神奇的奶萌兔吧(强行盗梗)! (奶萌兔来给你讲解啦~...

weixin_34025151的博客 205

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

动态规划DP问题分类和经典题型

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 ...

qq_42945742的博客 554

动态规划入门:从记忆化搜索到动态规划

在搜索过程中,当搜索树中存在大量重复的节点时,我们可以通过引入一个"备忘录"(通常是一个数组或哈希表)来优化计算。这个备忘录会记录第一次搜索到某个节点时的计算结果。当后续再次遇到相同的节点时,就可以直接从备忘录中获取之前存储的结果,避免了重复计算的开销。例如,在计算斐波那契数列时,fib(5) = fib(4) + fib(3),而fib(4)又需要计算fib(3)+fib(2)。如果不使用记忆化,fib(3)会被重复计算多次。使用记忆化后,每个fib(n)只需计算一次。递推改递归。

2401_87287423的博客 867

【动态规划】三种基本背包问题

动态规划 是对解最优化问题的一种途径 它往往是针对一种最优化问题 根据问题的不同性质 确定不同的设计方法 因为这篇文章我想说点关于背包问题的事情 所以不再过多介绍动态规划 背包问题 是动态规划中的一个经典题型 在联赛中也经常出现 其基本问题主要分为01 完全 多重 三种 下面就通过程序与例题分别来说一下三种基本问...

海阔天空 1004

动态规划基础问题

动态规划之01背包,硬币问题,最长上升子序列等

释怀°Believe的博客 674

【动态规划算法】路径问题

动态规划(Dynamic Programming,简称 DP)是一种通过分解复杂问题为重叠子问题,并存储子问题的解以避免重复计算,从而高效求解具有特定性质(重叠子问题、最优子结构)问题的算法思想。一、核心思想:“分解 + 复用”动态规划的核心在于:1.将原问题拆解为规模更小的子问题;2.求解子问题后,将结果存储起来(记忆化),避免后续重复计算;3.基于子问题的解,推导出原问题的解。简单来说,就是 “”,二、动态规划的 2 个关键前提三、动态规划的 2 种实现方式四、经典应用场景。

关注学习C++领域,感谢陪伴,共同进步! 1483

DP(动态规划)学习心得

              动态规划学习心得   说实话吧,动态规划(DP)确实是一个比较难的知识点,对于初学者来说,是一个难过的坎(笔者的脸呢?开玩笑。)。动态规划就是我从初学开始遇到的最神奇的解法,它不同于暴力搜索,也不同于一般的贪心,能够以出乎人意料的时间复杂度(近似于O(n^2))解决一些难题,算法远远优于一般的深搜(O(2^n))。不过,动态规划的思维性比较强,必须会设...

weixin_30846599的博客 648

动态规划简介

动态规划与分治法类似,都是通过组合子问题的解来求解原问题。区别在于分治法用于求解不相交的子问题,而动态规划应用于子问题重叠情况。这种情况下如果还采用分治法会反复在多个重复子问题之间跳转,增加时间复杂度。采用动态规划的方法,将每一个子问题的解存在表格中,从而避免重新计算,提高效率。在处理动态规划问题的时候主要有以下三步:1.确定问题子结构(即每个状态可以由那些状态量表示)2.确定状态转移方程3.确定初始状态(边缘状态)以下用一个简单的题目来做例子。

2501_92638822的博客 1666

2021-04-10

**本周学习总结** 通过本周的学习我了解到了动态规划,动态规划是一种非常精巧奇妙富有思维的算法思想,通过本周接触到的几道题,可以说动态规划就没有固定的写法。对于动态规划的学习,我认为需要多接触一些经典例题,这样学习起来的效果会更加的有效。动态规划解题的思想大类是将一个复杂的问题分解成若干个分支问题,通过综合各分支问题的最优解,来获取整体问题的最优解。还有,在解绝分支问题时,它需要将分支问题的解记录下来,以便其它分支问题的使用。 对于本周看题,做题中认为见到过...

weixin_52414059的博客 160
上一篇: 全面理解动态规划的背包问题
下一篇: 贪心算法及其经典例题
追梦少年ML
博客等级 码龄7年 36粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值