干货分享丨动态规划十问十答

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 动态规划十问十答,带你扫盲DP

动态规划是IT技术面试中最难的算法,很多人披荆斩棘,最终还是跪在动态规划题目上。

今天给大家总结动态规划十问十答,快速帮你扫盲动态规划。

问1
动态规划是个什么鸟蛋?

答:动态规划是一种通过“大而化小”的思路解决问题的算法。区别于一些固定形式的算法,如二分法,宽度优先搜索法,动态规划没有实际的步骤来规定第一步做什么第二步做什么。
所以更加确切的说,动态规划是一种解决问题的思想。
这种思想的本质是,一个规模比较大的问题(假如用2-3个参数可以表示),是通过规模比较小的若干问题的结果来得到的(通过取最大,取最小,或者加起来之类的运算)所以我们经常看到的动态规划的核心——状态转移方程都长成这样:

  • fi = fi - 1 + fi
  • f[i] = max{f[j] if j < i and …} + 1
  • fi = f0 && judge(1,i) || f1 && judge(2,i) || …

问2
动态规划面试考得多么?

答:多。并且越来越多。随着CS从业与求职者的增加,并伴随大家都是“有备而来”的情况下,一般简单的反转链表之类的题目已经无法再在面试中坚挺了。因此在求职者人数与招聘名额的比例较大的情况下,公司会倾向于出更难的面试问题。而动态规划就是一种比较具有难度,又比较“好出”的面试问题。相比其他的算法与数据结构知识来说,贪心法分治法太难出题了,搜索算法往往需要耗费求职者过长的程序编写时间一般也不倾向于出,二叉树链表等问题题目并没有那么多,而且求职者也都会着重准备这一块。因此动态规划这一类的问题,便越来越多的出现在了面试中。

问3
动态规划快在哪儿?

答:动态规划一般来说是“高效”的代名词,因为其解决的问题一般退而求其次的算法只有搜索了。以“数字三角形”一题为例子。

在“三角矩阵”中找一条从上到下的路径,使得权值之和最小。如果使用暴力搜索的算法,那么需求穷举出2^(n-1)条路径(n为三角形高度),而使用动态规划的话,则时间复杂度降低到了n^2,完成了质的飞跃。

那么究竟为什么这么快呢?原因在于动态规划算法去掉了“无用和重复的运算”。在搜索算法中,假如从A->B有2条路径,一条代价为10,另外一条代价为100,B->终点有1024条路径。当我们选择了代价为10的那条路径走到B时,可以继续往下走完1024条路径到终点,但是在此之后,我们再从代价为100的路径从A走到B时,我们可以发现此时无论如何走,都不可能有刚才从10的路径走过来更好,所以这些计算是“无用”的计算,也可以说是“重复”的计算。这就是动态规划之所以“快”的重要原因。

**
问4**
学习动态规划有什么捷径?

答:我们将动态规划的常见类型分为如下几种:

  • 矩阵型
  • 序列型
  • 双序列型
  • 划分型
  • 区间型
  • 背包型
  • 状态压缩型
  • 树型

其中,在技术面试中经常出现的是矩阵型,序列型和双序列型。划分型,区间型和背包型偶尔出现。状态压缩和树型基本不会出现(一般在算法竞赛中才会出现)。

每种类型都有着自己的题目特点和状态的表示方法。以矩阵型动态规划为例,一般题目会给你一个矩阵,告诉你有一个小人在上面走动,每次只能向右和向下走,然后问你比如有多少种方案从左上走到右下

这种类型状态表示的特点一般是使用坐标作为状态,如fi表示走到(i,j)这个位置的时候,一共有多少种方案。状态的转移则是考虑是从哪儿走到(i,j)这个坐标的。而序列型的动态规划,一般是告诉你一个序列;双序列的动态规划一般是告诉你两个字符串或者两个序列。

将所做过的动态规划问题按照这些类别进行归类,分析状态的表示方法和状态转移方程的构造方法在每种类型中的近似之处,会让你更快的学会动态规划。

更多内容请参考九章算法《动态规划专题班》

问5
什么样的问题适合使用动态规划?

答:可以使用动态规划的问题一般都有一些特点可以遵循。如题目的问法一般是三种方式:

  1. 求最大值/最小值
  2. 求可不可行
  3. 求方案总数

如果你碰到一个问题,是问你这三个问题之一的,那么有90%的概率是使用动态规划来求解。

要重点说明的是,如果一个问题让你求出“所有的”方案和结果,则肯定不是使用动态规划。

问6
解决一个动态规划问题的步骤是什么?

答:首先根据“问5”判断是否是动态规划的问题,如果是,则尝试将其按照“问4”进行分类,找到对应的类别和相似的问题。接着从下面的4个要素去逐步剖析解决这道题:

  1. 状态是什么
  2. 状态转移方程是什么
  3. 状态的初始值是什么
  4. 问题要求的最后答案是什么

每个步骤分析完成之后,就基本上解决了整道动态规划的问题。

问7
怎样优化动态规划的时间?

答:一般来说,使用动态规划求解的问题,时间上已经比暴力搜索要优化很多了。但是仍然存在着一些可以优化的空间。通常来说,动态规划的时间优化,有如下两种常见的方式:

  1. 通过变换状态优化
  2. 通过决策单调优化

对于通过变换状态来优化的问题比较难,需要一些经验和灵感。而对于决策单调的优化,则比较简单,但适用范围不广,一般只适用于划分型动态规划当中,通常这个方法可以将复杂度降低一个数量级。

**
问8**
怎样优化动态规划的空间?

答:动态规划的空间优化只有一种方法,就是使用滚动数组进行优化。以一个二维的动态规划为例子。假如状态转移方程如下:fi = fi - 1 + fi。我们可以发现,第i层的状态,已经和第i-2层的状态没有关系了,那么这种情况下,用于存储第i-2层的空间就可以被重复利用。方法非常简单,把数组的第一维对2取模就可以了:fi % 2 = f(i - 1) % 2 + fi % 2。这种方法通常可以将空间复杂度降低一个数量级。

问9
有哪些动态规划题目必须要练习的?

在 LintCode 上包含了80余道动态规划的练习题

都是从实际的面试问题中汇总的精选练习,熟练掌握这些练习题,基本上可以满足面试需求。

问10
有什么参考资料可以推荐么?

九章算法《动态规划专题班》

相关文章
|
存储 数据采集 XML
使用Crawler实例进行网页内容抓取
使用Crawler实例进行网页内容抓取
|
机器学习/深度学习 人工智能 算法
破解生成式AI认知边界:框架思维引擎如何重塑产业智能化未来
该内容深入解析了核心技术架构,涵盖思维链强化系统(DTT)、认知框架建模体系和实时纠偏算法体系。DTT通过多级问题拆解、混合精度推理及分布式验证,大幅提升复杂问题处理能力;认知框架结合知识图谱与逻辑推理,实现精准医疗诊断等应用;实时纠偏算法则通过多级验证机制保障事实与逻辑准确性。整体架构分应用层、框架层和基础层,支持高效、可信的跨领域适配。技术创新体现在混合计算加速、持续学习机制等方面,显著优于传统模型,在事实准确性、逻辑连续性及响应速度上优势明显。
474 28
|
边缘计算 人工智能 5G
《元宇宙痛点求解:网络延迟与带宽限制突破指南》
元宇宙的沉浸式体验依赖于低延迟和高带宽网络,但当前网络延迟和带宽限制严重影响了用户体验,如VR游戏中的画面延迟和社交场景中的卡顿。5G、6G技术及卫星通信将大幅降低延迟并提升带宽,边缘计算与云计算的协同优化数据处理,AI智能调整传输策略,SDN等创新网络架构也将助力突破瓶颈。未来,这些技术将共同推动元宇宙实现流畅、逼真的沉浸式体验。
709 1
《元宇宙痛点求解:网络延迟与带宽限制突破指南》
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
存储 数据可视化 数据挖掘
想提升电商业务效率?这 6 款团队协作软件千万别错过!
在电商旺季,订单量激增,团队需高效协调运营、营销、客服、物流等环节。可视化协作办公软件成为必备工具,提升业务效率与客户满意度。本文推荐6款优秀软件:板栗看板(国产)、Trello、Asana、Wrike、Monday.com和Basecamp。这些软件具备简洁易用的操作界面、强大的可视化功能、定制化任务管理及便捷的跨团队协作,帮助电商团队应对商品上架、促销推广、订单处理等挑战。J人主导的电商公司可根据自身需求选择最适配的工具,实现高效运营与业务增长。
568 16
|
JSON JavaScript 小程序
组件的插槽以及组件通信
这篇文章介绍了微信小程序中组件的插槽使用和组件间通信的方法,包括单个插槽、多个插槽的运用,以及属性绑定、事件绑定和获取组件实例的通信方式。
组件的插槽以及组件通信
|
API 微服务
Traefik 微服务 API 网关教程(全)
Traefik 微服务 API 网关教程(全)
|
C语言
C语言程序设计核心详解 第二章:数据与数据类型 4种常量详解 常见表达式详解
本文详细介绍了C语言中的数据与数据类型,包括常量、变量、表达式和函数等内容。常量分为整型、实型、字符型和字符串常量,其中整型常量有十进制、八进制和十六进制三种形式;实型常量包括小数和指数形式;字符型常量涵盖常规字符、转义字符及八进制、十六进制形式;字符串常量由双引号括起。变量遵循先定义后使用的规则,并需遵守命名规范。函数分为标准函数和自定义函数,如`sqrt()`和`abs()`。表达式涉及算术、赋值、自增自减和逗号运算符等,需注意运算符的优先级和结合性。文章还介绍了强制类型转换及隐式转换的概念。
943 2
|
前端开发 Java 关系型数据库
Spring MVC实现mysql数据库增删改查完整实例
Spring MVC实现mysql数据库增删改查完整实例
1274 0
Spring MVC实现mysql数据库增删改查完整实例