动态规划太难?刷题无数,不如掌握这些套路

Posted Python与机器智能

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划太难?刷题无数,不如掌握这些套路相关的知识,希望对你有一定的参考价值。




又是一年金九银十,你跳槽了么?面试被虐了么?

 

想必面过大厂的人都知道,动态规划一直是个大热门。

 

首先,动态规划考察了面试者的数学模型抽象能力和逻辑思维能力,可以反应个人在算法上的综合能力;其次,懂得了动态规划,能在工作中无限降低算法复杂度,在程序员晋升上也能胜人一筹。

 

但即使知道它很重要,很多人一想起来依然是“脑壳痛”,在工作和面试中也很难实践应用,问题出在哪了?

 

很简单:不理解动规的思想,无法掌握解题套路。

 

作为一种高级技术思想,动规是从一系列算法中演进而来的。求解动态规划的核心问题其实就是穷举,但穷举和动态规划在真正用的时候还是有区别的,首先要解决的是,什么样的问题要用动态规划,怎么用?

 

举个例子,在实际工作中,除非你碰到的问题是简单到找出一个数组中最大的值这样,对这种问题来说,你可以对数组进行排序,然后取数组头或尾部的元素,如果觉得麻烦,你也可以直接遍历得到最值。不然的话,你就得考虑使用动态规划来解决这个问题了。这样的问题一般都会让你求最大子数组、求最长递增子数组、求最长递增子序列或求最长公共子串、子序列等等。不知道你发现没有,这些问题里都包含一个“最”字,如果出现了这个字,你就该警惕它是否是动归问题。

 

具体怎么判断呢?你可以按照这样的思考顺序来解决问题:

 

  1. 优先考虑使用贪心算法的可能性;

  2. 然后是暴力递归进行穷举(但这里的数据规模不大);

  3. 还是不行呢?选择动态规划!

 

那么,当我们遇到一个算法问题,到底是否该使用动态规划来求解呢?可以参考这

大特点

 

  • 求最优解问题(最大值和最小值)

  • 求可行性(True 或 False)

  • 求方案总数

  • 数据结构不可排序(Unsortable)

  • 算法不可使用交换(Non-swappable)

 

如果面试题目出现这些特征,那么在 90% 的情况下你都能断言它就是一个动归问题。

 

这套判断动规问题的思路,来自于卢誉声,Autodesk 核心数据平台和计算平台资深工程师,除此之外,我还找到了他整理的「动态规划知识结构图」,可以收藏

以上是关于动态规划太难?刷题无数,不如掌握这些套路的主要内容,如果未能解决你的问题,请参考以下文章

掌握套路,你也会用动态规划

Leetcode 动态规划刷题总结

肝!动态规划

有了这些套路,面试再也不怕遇到动态规划!

告别动态规划,连刷 40 道题,我总结了这些套路,看不懂你打我(万字长文)

动态规划该如何优化?我总结了这些套路,以后优化就是分分钟