数据结构【1】-如何理解数据结构中的动态规划【上】?

AI研习图书馆,发现不一样的精彩世界

数据
结构

动态规划知识点详解及实践

一、前言

算法与数据结构,是研发类或技术类岗位求职过程中无法避免的一座大山,无论是在笔试还是面试中。经常在网上看到,诸如不懂算法与数据结构,就不懂真正的编程的一类话语。笔试时,熟悉数据结构常用算法,可以让我们高效解决编程题目;面试时,熟悉数据结构,会让我们对于面试官的提问对答如流。面试官几乎必问:你主要使用什么语言?那你了解数据结构吗?那我问你几个基本的问题......

先天不足,后天努力;学海无涯,天道出勤。由于最近在突击算法与数据结构,故本专栏系列主要记录算法与数据结构系列知识点,欢迎点赞、打卡学习~
二、动态规划

算法与数据结构中,动态规划问题一直是大厂面试时最频繁出现的算法题,其主要原因在于此类问题灵活度高,思维难度大,没有很明显的套路做法。

正是因为这个原因,我将持续更新此系列,来尝试破解面试中所涉及的动态规划问题。本次更新是这个系列的第一篇总结,主要目的是说明动态规划是什么,常见动态规划问题我们应该如何思考?

1. 基本思想

动态规划,通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。

动态规划方法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。

若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。

2. 问题分析

本篇总结一共分成三个部分,具体内容框架如下图所示:

(一) 问题引入

宝石挑选:

小 Q 是一个宝石爱好者。一天,小 Q 来到了宝石店,店家觉得小 Q 是个宝石行家,于是决定和小 Q 玩一个游戏。游戏规则如下:共有

块宝石,每块宝石在小 Q 心中都有其对应的价值。注意,由于某些宝石质量不佳,因此存在只有店家倒贴钱,小 Q 才愿意带走的宝石的情形,即宝石价值可以为负数。

小 Q 可以免费带走一个连续区间中的所有宝石,比如区间

或区间

中的所有宝石。请问小 Q 能带走的最大宝石价值是多少?

问题分析:

首先思考最暴力最直接的解法。

暴力求解

首先,我们枚举所有区间,暴力累加区间中所有宝石的价值,最后选一个价值最大的区间。时间复杂度

显然有些无法接受,因此想想有没有办法优化,比如优化掉暴力累加的那一部分。

优化 1.0

仔细思考不难发现,我们可以枚举区间右端点,然后固定右端点,左端点不断向左移动,边移动,边累加,就可以将时间复杂度优化到

例如,固定右端点为 3,那么左端点就从 3 移动到 1,边移动边累加结果,就可以在移动过程中计算出区间

的答案了。因此,枚举所有区间右端点,即可在

时间复杂度内找到答案。但是

时间复杂度还是有些过高,因此思考有没有办法继续优化呢?

优化 2.0

观察

的解法,不难发现,我们用了

的时间复杂度才求出了固定某个点为区间右端点时,区间最大价值和。

例如,我们固定了

为区间右端点后,通过从n到1枚举左端点,才求出了以

为区间右端点时的区间最大价值和,即

的时间复杂度。

那么,继续思考,「以

为区间右端点的区间最大和」,与「以

为区间右端点的区间最大和」,这两者之间是否有联系呢?

为了描述方便,接下来用

来代替「以

为区间右端点的区间最大和」,用

来代替第

块宝石的价值。

观察后不难发现,如果

为正数,则

一定等于

;如果

为负数,则

一定等于

。因此可以推导出如下转移方程:

根据上述转移方程,可以在

时间复杂度内求出最大的

,于是将此题时间复杂度优化到了

,而这个优化的过程就是「动态规划」的过程。

总结:在上述推导的过程中,一共可以分为两步:

  1. 将整个问题划分为一个个的子问题,并令

    为第

    个子问题的答案

  2. 思考大规模的子问题如何从小规模的子问题推导而来,即如何由

    推出

这两个步骤便是「动态规划」解题思路的核心所在,即确定动态规划时的「状态」与「转移方程」。

(二) 动态规划概述

动态规划(Dynamic Programming),因此常用 DP 指代动态规划。本块内容我们主要讲解「动态规划解题思路」与「动态规划问题类别」。

1. 动态规划解题思路

动态规划主要分为两个核心部分,一是确定「DP 状态」,二是确定「DP 转移方程」。

DP 状态

「DP 状态」的确定主要有两大原则:

  1. 最优子结构

  2. 无后效性

最优子结构

以「宝石挑选」为例题来讲解这两大原则,首先是「最优子结构」。

什么是「最优子结构」?将原有问题化分为一个个子问题,即为子结构。而对于每一个子问题,其最优值均由「更小规模的子问题的最优值」推导而来,即为最优子结构。

因此「DP 状态」设置之前,需要将原有问题划分为一个个子问题,且需要确保子问题的最优值由「更小规模子问题的最优值」推出,此时子问题的最优值即为「DP 状态」的定义。

例如在「宝石挑选」例题中,原有问题是「最大连续区间和」,子问题是「以

为右端点的连续区间和」。并且「以

为右端点的最大连续区间和」由「以

为右端点的最大连续区间和」推出,此时后者即为更小规模的子问题,因此满足「最优子结构」原则。

由此我们才定义 DP 状态

表示子问题的最优值,即「以

为右端点的最大连续区间和」。

无后效性

而对于「无后效性」,顾名思义,就是我们只关心子问题的最优值,不关心子问题的最优值是怎么得到的。

仍以「宝石挑选」例题为例,我们令 DP 状态

表示「以

为右端点的最大连续区间和」,我们只关心「以

为右端点的区间」这个子问题的最优值,并不关心这个子问题的最优值是从哪个其它子问题转移而来。

即无论

所表示区间的左端点是什么,都不会影响后续

的取值。影响

取值的只有

的数值大小。

那怎样的状态定义算「有后效性」呢?

我们对「宝石挑选」例题增加一个限制,即小 Q 只能挑选长度的连续区间。此时若我们定义

表示「以

为右端点的长度

的最大连续区间和」,则

的取值不仅取决于

的数值,还取决于

是如何得到的。

因为如果

取得最优值时区间长度

,则

不能从

转移得到,即

的状态定义有后效性。

最后概括一下,「最优子结构」就是「DP 状态最优值由更小规模的 DP 状态最优值推出」,此处 DP 状态即为子问题。而「无后效性」就是「无论 DP 状态是如何得到的,都不会影响后续 DP 状态的取值」。

DP 转移方程

有了「DP 状态」之后,我们只需要用「分类讨论」的思想来枚举所有小状态向大状态转移的可能性即可推出「DP 转移方程」。

我们继续以「宝石挑选」问题为例。

在我们定义「DP 状态」

之后,我们考虑状态

如何从

这些更小规模的状态转移而来。

仔细思考可以发现,由于

表示的是连续区间的和,因此其取值只与

有关,与

均无关。

我们再进一步思考,

取值只有两种情况,一是向左延伸,包含

,二是不向左延伸,仅包含

,由此我们可以得到下述「DP 转移方程」:

注意,

2. 动态规划问题类别

讲述完 DP 问题的解题思路后,我们来大致列举一下 DP 问题的类别。

DP 问题主要分为两大类,第一大类是 DP 类型,第二大类是 DP 优化方法。

如上图所示,其中在 DP 类型部分,一般面试过程中最常考察的就是「线性 DP」,而在优化方法部分,最常见的是「RMQ 优化」,即使用线段树或其它数据结构查询区间最小值,来优化 DP 的转移过程。

(三) 习题实战

由于篇幅限制,习题实战部分请看下一期文章,谢谢~

(0)

相关推荐

  • 动态规划详解

    这篇文章是我们号半年前一篇 200 多赞赏的成名之作 动态规划详解 的进阶版.由于账号迁移的原因,旧文无法被搜索到,所以我润色了本文,并添加了更多干货内容,希望本文成为解决动态规划的一部「指导方针」. ...

  • 剑指 Offer 14- I. 剪绳子

    我服了.动态规划杀我. 可以说一说解决动态规划的思路(只做了两三道就总结了emmm) 1.识别动态规划问题 --重叠子问题:大问题可以分为一个个子问题.和分治策略分割的子问题不同(分治问题的子问题是相 ...

  • 万字长文,佩奇算法八大思想!

    零.前言 大家好,我是小浩. 分享一篇由读者 @Kevin_涛 写的算法思想文章: 在讲解八大算法思想之前我想先简述以下三个问题,以便大家更好的理解算法. 1. 什么是算法? <算法导论> ...

  • 动态规划之武林秘籍

    听到 动态规划 这个响亮的大名你可能已经望而却步,那是因为这个响亮的名字真的真的很具有迷惑性,不像递归.回溯和贪心等等算法一样,其文即其意,而动态规划则不同,很容易望文生义,真可谓害人不浅,今天我就带 ...

  • 动态规划之状态转移方程-NOIP提高组历年高频考点(4)

    通过分析NOIP2011-2018年提高组的试题我们就会发现,考察最多的考点前三名就是模拟,动态规划和贪心算法.今天我们来介绍一下动态规划常用的状态转移方程. 动态规划之状态压缩DP-NOIP提高组历 ...

  • 贪心算法:买卖股票的最佳时机II

    贪心有时候比动态规划更巧妙,更好用! 通知:一些录友基础比较薄弱,不知道从哪里开始刷题.可以看一下公众号左下角的「算法汇总」,「算法汇总」已经把题目顺序编排好了,这是全网最详细的刷题顺序了,方便录友们 ...

  • 动态规划答疑篇

    ----------- 这篇文章就给你讲明白两个问题: 1.到底什么才叫「最优子结构」,和动态规划什么关系. 2.为什么动态规划遍历 dp 数组的方式五花八门,有的正着遍历,有的倒着遍历,有的斜着遍历 ...

  • 狂刷100道题,我是怎么向5岁侄女解释动态规划的? | 掘金年度征文

    我膨胀了,相信看了这个标题的同学,肯定忍不住破口大骂,什么瓜皮哦,dynamic programming这么简单吗,在我的印象里,尼玛动态规划是最难的. 背景 侄女5岁现在开始学习加减法了,每次做数学 ...

  • 数据结构【2】-如何理解数据结构中的动态规划【下】?

    AI研习图书馆,发现不一样的精彩世界 数据 结构 动态规划知识点详解及实践[下] 上篇文章我们讲到了动态规划的基本知识点,接下来,我们将以三道LeetCode习题为例,来强化一下确定「DP 状态」和「 ...

  • 理解数据才是企业数字化中最重要的部分

    什么是企业数字化建设中最重要的部分? IT基础设施架构吗?当然不是,技术问题可以找第三方技术公司解决. 在企业数字化建设中,通过企业管理学习,IT基础设施架构只是完成了获取数据部分,更重要的是要深度理 ...

  • 标准化和归一化,请勿混为一谈,透彻理解数据变换

    标准化与归一化 5.1.log变换 5.2.sigmoid变换(sigmoid函数) 5.3.softmax变换(softmax函数) 5.4.boxcox变换 1.1.定义 1.2.联系和差异 1. ...

  • 海外观点: 电竞数据“虚高”的风评背后,用户需要理解数据逻辑

    如果用户不够了解电竞产业报告和其中的数据逻辑,该数据所表现的差异和变化就意义不大. 原文:Chris Hana(TEO电竞观察家联合创始人) "如果想了解市场,大多时候都需要数据来佐证投资人 ...

  • 递归遍历各种数据结构,深入理解前序遍历,后续遍历,深度优先dfs。

    一.递归遍历数组 public class Graph4Test { public static void main(String[] args) { int[] a1 = new int[]{1,2 ...

  • 图解:数据结构中的6种「树」,柠檬问你心中有数吗?

    数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习数据结构时候,会遇到各种各样的基础数据结构,比如堆栈.队列.数组.链表.树...这些基本的数据结构类 ...

  • 难以理解,物理学家在地球上制造了“反重力”,一个颠倒的世界

    小船在漂浮的液体层上和下面漂浮 在地球上,一切都受地心引力的影响,它使物体落到地上,河流从高地流向大海.但我们能设计出一种反重力机器吗?它能让物体向上"下落",让船只倒挂起来吗? ...

  • 科技企业上市之数据合规(上)——审核要点篇

    作者:陈际红 韩璐 王雨婷 前言 数据是现代企业的血液,以大数据或互联网为工具开发新型服务或产品的传统行业企业也依赖数据带来新的业务增长点.随着<中华人民共和国网络安全法>("& ...

  • 数据治理连载漫画:什么是数据质量?(上)

    PRIMERS 引    子 大数据人工智能技术在日新月异的发展,各个行业领域的数据量都在迅猛增长.有研究发现,近年来,数字的数量每3年多就会翻一番.金融行业在发展中积攒了大量客户信息和数据信息,借助 ...