0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

常见的动态规划题目

算法与数据结构 来源:晨梦思雨 作者:晨梦思雨 2021-04-08 16:12 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

注:本文是BAT真题收录很值得大家花心思看完,看完会有收获。

前言

算法是面试大公司必考的项目,所以面试前准备好算法至关重要,今天整理的常见的动态规划题目,希望可以帮到大家。

要想学习其他绝世武功,要先打好基础。算法属于内功,则更为重要。

强盗抢劫

题目:强盗抢劫一排房间,每个房间都有钱,不能抢劫两个相邻的房间,要求抢的钱最多。数组如:[2,7,9,3,1]

思路:当输入房间数为0,1,2时,这个很好判断,当输入房间数字大于3时,就要用到动态规划了,方程是:

d9c404ee-93fc-11eb-8b86-12bb97331649.jpg

dp[i]是当抢到第i个数时,能抢到最大值,从局部最大值推到最终结果最大。

假如抢到第5个房间,那么第5个房间有二种情况,抢不和不被抢,因为只能隔房间。

如果抢到第4个房间,有个最大值;抢到第3个房间,有个最大值。

如果加上第3房间最大值,加上第5房间的最大值,大于抢到第4个房间时的最大时。那就抢3,5而不抢4,反而,就按抢4的策略。

这样从前往后推,最后的结果一定是最大的。

代码如下:

d9cfecaa-93fc-11eb-8b86-12bb97331649.png


跳台阶

题目描述:有 N 阶楼梯,每次可上一阶或两阶,求有多少种上楼梯的方法

先来分析下这个问题:

当N=1时,这个很好理解,只能跨1步这一种了

当N=2时,你每次可以跨1步或2步,那就是走2步或走两个1步

当N=3时,因为你可以跨1步或2步,那你在台阶1或2都能行。要计算到台阶1有多少种走法,到台阶2有多少种走法,然后2种相加,依次逆推。

当N=4时,你在台阶2或3都能行,计算到台阶2有多少种走法,到台阶3有多少种走法,然后2者相加,依次逆推。

总结如下:你会发现,这是斐波拉切数列,使用递归出现重复计算问题,所以选择动态规划算法。

层数 公式 种数
1 f(1)=1 1
2 f(2)=2 2
3 f(3)=f(1)+f(2) 3
4 f(4)=f(2)+f(3) 5


第三层:3种(在第一层走2步或在第二层走1步)

第四层:5种(在第二层走2步或在第三层走1步)

d9de6488-93fc-11eb-8b86-12bb97331649.jpg

i,j首先赋边界值,res保存i+j的值,每次前进,i,j,res的值都会被赋到前面结果。

上面的算法是底向上,递归相当于自顶向下,避免了重复计算。

矩形最小路径和

题目:
给定一个,包含非负整数的 m x n 网格。请找出一条,从左上角到右下角的路径。使得路径上,所有数字总和为最小,每次只能向下,或者向右移动一步。

输入:[[1,3,1],
[1,5,1],
[4,2,1]]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

先看动态方程:

i值 j值 dp方程
i>0 j=0 dp[i][0] = dp[i−1][0] + grid[i][0]
i=0 j>0 dp[0][j] = dp[0][j−1] + grid[0][j]
i>0 j>0 dp[i][j] = min(dp[i−1][j], dp[i][j−1]) + grid[i][j]


说明:因为 i=0 和 j=0 是临界条件,所以要先求出来。当 i>0 和 j>0 时,看如上数组,5 可以由上方3,或者左方 1 走过来。

当走5的时候,要选取上方3对应的dp,与左方1 对应的dp进行比较,选择较小值累加,这样走出来的才是最小值。最后推出,到右下角的最小值。

代码如下:

d9e92c2e-93fc-11eb-8b86-12bb97331649.jpg

sum用来存储,从[0][0]到sum[i][j]路径的最小和,看看每次sum的变化,sum[1][1]=7意思是,从[0][0]到[1][1]路径最小和是7。

程序先把,第2行对应的sum都求出来,再把第2列对应的sum都求出来,最后求sum[2][2]就很容易了。

最后,sum[i-1][j-1]就是推出的最小值,上述代码就是dp方程的实现。

划分数组为两个相等的子集

题目:输入:[1, 5, 11, 5], 输出:[1, 5, 5]和[11]

思路是,相对数组中每个数求dp,最后就会找到dp[target]是否为true。

如果 dp[j - nums[i]] 为true的,说明可以组成 j-nums[i]这个数,再加上nums[i],就可以组成数字j。

当j = target是同样道理,要想找到dp[target]为true,就找到数组中,几个值的和为target时,对应下标的dp值为true,这样反推dp[target]为true。

代码如下:

d9f3a44c-93fc-11eb-8b86-12bb97331649.jpg

乘积最大连续子数组

题目:
输入一个整形数组,数组里有正数也有负数。数组中连续的一个,或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。

例如数组:arr[]={1, 2, 3, -2, 4, -3 } 最大子数组为 {1, 2, 3, -2, 4} 和为8。

思路:fmax(i) 表示,以第 i 个元素结尾的,乘积最大子数组的乘积,fmin(i) 表示,以第 i 个元素结尾的,乘积最小子数组的乘积。

这里分为最大和最小是因为数组可能存在负数,最大值乘以负数变成较小值,最小值乘以一个负数也可能变成最大值。

比较方程是:当前数乘以上一个最大值,当前值,当前数乘以上一个最小值。这三者比较,其中的最大值,就是我们要的最大值。

同样,每次也要把最小值计算出来,方式同上。

代码如下:

d9fd675c-93fc-11eb-8b86-12bb97331649.jpg

等差递减区间的个数

题目:求一个数组中等差递减区间个数,等差数列必须是连续的。

例子:A = [1, 2, 3, 4],个数为3,分别是:[1, 2, 3], [2, 3, 4]

等差数列公式:

da39e5ce-93fc-11eb-8b86-12bb97331649.jpg


先看一个表:

数组 等差数列的数目 与上一组等差数列比较
1 23 1 1 - 0 = 1
12 3 4 3 3 - 1 = 2
12 3 45 6 6 - 3 = 3
1 2 3 4 5 6 10 10 - 6 =4

其实仔细观察,发现这是一个斐波拉切数列,0,1….n-2数的求和,动态规划找到方程了,就发现非常简单了。

这就是规律,但需要自己去发现规律,有些题目咋看一脸懵逼,仔细看就会发现其中的规律。

dp[i] 表示到i位置时,子数组的个数。数组长度大于3。

下面看下代码:

da450cf6-93fc-11eb-8b86-12bb97331649.jpg

下面再看代码执行值的变化过程:

i值 子数组 dp[i] res
i = 2 123 1 1
i = 3 123 2341234 2 3
i = 4 123 2341234 2345 12345 3 6
i = 5 123 2341234 2345 1234523456123456 4 10


很明显,就是0,1….n-2数的求和。

最长回文子串

题目:求最长回文子串。输入: "babad",输出: "bab"。注意: "aba" 也是一个有效答案。

dp[i][j]表示,字符s从下标i到下标j,是否为回文串。

如果bab是回文串,那么ababa也是回文串。因为,在两边增加了相同的数。同理,可以给出动态方程:

da4f6296-93fc-11eb-8b86-12bb97331649.png

下面看下代码:

da58a39c-93fc-11eb-8b86-12bb97331649.jpg

这段代码用利用了dp[i + 1][j - 1],其前面已经计算出来了。

当k = 4时,字符串最长,最后符合条件的回文子串最长。注意整个循环遍历的过程,用k最为两个下标的间距,然后遍历每种可能的结果,判断是否回文。

最长的子串最后判断,将符合条件的子串保存起来。动态规划方程推测极为重要。

最长递增子序列

求一个数组的最长自增子序列。

输入: [10,9,2,5,3,7,101,18],输出: 4。

解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

代码如下:

da61e51a-93fc-11eb-8b86-12bb97331649.png

dp[i]表示以a[i]这个元素结尾的最长递增子序列的长度。

想求 dp[5] 的值,也就是想求以 nums[5] 为结尾,其最长递增子序列。

nums[5] = 3,既然是递增子序列。我们只要找到,前面那些结尾比 3 小的子序列,然后把 3 接到最后,就可以形成新的递增子序列,而且这个新的子序列长度加一。

当然,可能形成很多种新的子序列,但是我们只要最长的,把最长子序列的长度作为 dp[5] 的值即可。

根据此依次类推到前面,d[0],d[1]…d[i]都是这样求出来的,看来动态规划有些是逆推的。

最大子序和

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

输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6,解释: 连续子数组 [4,-1,2,1] 的和最大,为 6

解决思路:动态规划

动态规划方程:

da6da92c-93fc-11eb-8b86-12bb97331649.jpg


动态规划:定义dp[i]表示为nums[i]为结尾的[连续子数组的最大和。

当遍历到nums[i]时,我们需要比较nums[i]和dp[i-1]+nums[i]谁更大,然后取较大值。

代码如下:

da930686-93fc-11eb-8b86-12bb97331649.jpg

责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4761

    浏览量

    97147
  • 动态规划
    +关注

    关注

    0

    文章

    17

    浏览量

    9071

原文标题:大厂动态规划面试汇总,重量级干货,彻夜整理

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于感知引导的多步骤精细操作任务与运动规划

    传统的任务与运动规划(TAMP)系统在机器人操作应用中通常依赖静态模型运行,因此在面对新环境时往往表现不佳。将感知与操作相融合,是应对这一挑战的有效途径,使机器人能够在执行过程中实时更新规划,从而适应动态变化的场景。
    的头像 发表于 11-14 10:18 1072次阅读
    基于感知引导的多步骤精细操作任务与运动<b class='flag-5'>规划</b>

    基于SIMP与折衷规划法的航空附件齿轮箱结构轻量化设计与动态特性提升

    航空发动机附件齿轮箱作为动力传递系统的关键部件,其箱体结构设计直接影响发动机的功率密度、可靠性及振动特性。针对传统经验设计方法难以满足高刚度、轻量化及高动态性能要求的挑战,本文提出了一种基于折衷规划法的多目标拓扑优化方法。
    的头像 发表于 11-07 15:21 433次阅读
    基于SIMP与折衷<b class='flag-5'>规划</b>法的航空附件齿轮箱结构轻量化设计与<b class='flag-5'>动态</b>特性提升

    光伏电站无人机巡检管控平台如何进行任务规划管控?

    技术手段与管理制度,从而实现对光伏电站巡检效率、安全性与数据价值的平衡。 在任务规划管控方面,光伏电站无人机巡检管控平台实现了精准化与动态调整。针对巡检任务分层设计,如日常巡检采用的航线、频率等,以及重点检测的
    的头像 发表于 10-27 17:13 412次阅读
    光伏电站无人机巡检管控平台如何进行任务<b class='flag-5'>规划</b>管控?

    2025电赛题目问答(已更新)

    2025电赛题目问答(已更新)
    的头像 发表于 07-30 12:59 4601次阅读
    2025电赛<b class='flag-5'>题目</b>问答(已更新)

    投入式水位计:助力水资源规划与结构安全

    的设备。一、水资源规划:数据驱动的科学管理水资源的高效利用依赖于对水体动态的精准掌握。投入式水位计通过测量水库、河流、湖泊等水位变化,为蓄水调度、灌溉规划及生态保护提
    的头像 发表于 06-19 13:17 430次阅读
    投入式水位计:助力水资源<b class='flag-5'>规划</b>与结构安全

    AGV小车中的动态路径规划算法揭秘

    并非一成不变时,动态路径规划能力就显得至关重要。本文将深入探讨几种主流的动态路径规划算法(如A、Dijkstra、RRT等),并解析它们如何在AGV行业中大显身手。 为何需要
    的头像 发表于 06-17 15:54 1163次阅读
    AGV小车中的<b class='flag-5'>动态</b>路径<b class='flag-5'>规划</b>算法揭秘

    AGV通信第2期 AGV集群智能路径规划解决方案

    在智能制造加速发展的背景下,AGV作为智慧物流的核心载体,其路径规划的智能化水平直接影响工厂的运作效率。在工厂物流升级过程中,企业面临以下技术挑战:   动态环境适应:复杂工况下需实时避障并保持最优
    的头像 发表于 05-09 14:03 533次阅读
    AGV通信第2期 AGV集群智能路径<b class='flag-5'>规划</b>解决方案

    CADENAS 数字产品配置器轻松实现Ascendor电梯规划

    。2022 年,Ascendor 启动了一项数字化推进计划,其中一个重要部分就是实施由 CADENAS 提供技术支持的数字化产品配置器。 利用高质量的规划数据进行灵活的电梯规划 数字产品配置器提供
    发表于 04-28 14:22

    函数指针的六个常见应用场景

    函数指针在嵌入式开发中有着广泛的应用,它让代码更加灵活,减少冗余,提高可扩展性。很多时候,我们需要根据不同的情况动态调用不同的函数,而函数指针正是实现这一需求的重要工具。本文将介绍六个常见的函数指针
    的头像 发表于 04-07 11:58 1130次阅读
    函数指针的六个<b class='flag-5'>常见</b>应用场景

    具身智能工业机器人路径规划算法成为破局关键

    在工业4.0与智能制造深度融合的今天,传统路径规划算法已难以满足动态生产环境的需求。面对复杂场景下的高精度避障、实时决策与多任务协同挑战,具身智能工业机器人路径规划算法成为破局关键。作为具身智能领域
    的头像 发表于 03-28 15:01 730次阅读

    单片机:请问一下图中题目怎么解答?

    请问一下图中题目怎么解答?
    发表于 03-19 20:19

    LLC动态性能分析

    这里的LLC动态是指LLC电路在突加负载时的动态响应。一般用输出电压的下跌和过冲评判LLC动态性能。
    的头像 发表于 03-19 09:45 1835次阅读
    LLC<b class='flag-5'>动态</b>性能分析

    0基础小白请教这个有关二极管的题目怎么做?谢谢!

    0基础小白请教这个有关二极管的题目怎么做?谢谢!
    发表于 03-13 11:42

    MCSDK位置控制S形轨迹规划q轴电流存在冲击怎么解决?

    工程师您好,我用MCSDK生成了FOC位置控制的代码,在实际运行中发现,每隔t0时间q轴电流出现一次冲击(t0为S形轨迹规划9段时间的一段),如下图所示: 绿色线是用STM32CUBEMONITOR观察到q轴电流。 下图是S形规划的原理图: 我想请教一下怎么才能避免q轴
    发表于 03-11 06:51

    开关电源的基础知识题目及答案(免积分)

    本文含有开关电源的基础知识题目及答案,下载附件即可查看!
    发表于 03-06 15:52