令狐冲老师的动态规划总结

Posted 九章算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了令狐冲老师的动态规划总结相关的知识,希望对你有一定的参考价值。

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


令狐冲老师的动态规划总结


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


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


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


* f[i][j] = f[i - 1][j] + f[i][j - 1]

* f[i] = max{f[j] if j < i and …} + 1

* f[i][j] = f[0][j - 1] && judge(1,i) || f[1][j - 1] && judge(2,i) || …


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


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


问3
动态规划快在哪儿?  


答:动态规划一般来说是“高效”的代名词,因为其解决的问题一般退而求其次的算法只有搜索了。以“数字三角形”一题为例子(http://www.lintcode.com/problem/triangle/ ),在“三角矩阵”中找一条从上到下的路径,使得权值之和最小。如果使用暴力搜索的算法,那么需求穷举出2^(n-1)条路径(n为三角形高度),而使用动态规划的话,则时间复杂度降低到了n^2,完成了质的飞跃。那么究竟为什么这么快呢?原因在于动态规划算法去掉了“无用和重复的运算”。在搜索算法中,假如从A->B有2条路径,一条代价为10,另外一条代价为100,B->终点有1024条路径。当我们选择了代价为10的那条路径走到B时,可以继续往下走完1024条路径到终点,但是在此之后,我们再从代价为100的路径从A走到B时,我们可以发现此时无论如何走,都不可能有刚才从10的路径走过来更好,所以这些计算是“无用”的计算,也可以说是“重复”的计算。这就是动态规划之所以“快”的重要原因。


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


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


* 矩阵型

* 序列型

* 双序列型

* 划分型

* 区间型

* 背包型

* 状态压缩型

* 树型


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


每种类型都有着自己的题目特点和状态的表示方法。以矩阵型动态规划为例,一般题目会给你一个矩阵,告诉你有一个小人在上面走动,每次只能向右和向下走,然后问你比如有多少种方案从左上走到右下 (http://www.lintcode.com/problem/unique-paths/)。这种类型状态表示的特点一般是使用坐标作为状态,如f[i][j]表示走到(i,j)这个位置的时候,一共有多少种方案。状态的转移则是考虑是从哪儿走到(i,j)这个坐标的。而序列型的动态规划,一般是告诉你一个序列;双序列的动态规划一般是告诉你两个字符串或者两个序列。


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


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


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


1. 求最大值/最小值

2. 求可不可行

3. 求方案总数


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

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


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


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


1. 状态是什么

2. 状态转移方程是什么

3. 状态的初始值是什么

4. 问题要求的最后答案是什么


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


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


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


1. 通过变换状态优化

2. 通过决策单调优化


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


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


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


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


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


http://www.lintcode.com/tag/dynamic-programming/


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


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


  著名的《背包问题九讲》


https://www.kancloud.cn/kancloud/pack/70125

PS. 也可以直接在网上搜索背包九讲


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


全网唯一的 DP 专题课程

主讲人为:清华大学毕业,全国算法竞赛金牌得主,硅谷知名IT企业工程师


免费试听内容:

  • 动态规划和递归的区别

  • 动态规划的解题方法归纳

  • 常见动态规划类型总结

免费试听时间:


美西时间 3月9日周六 13:30-15:30

美东时间 3月9日周六 16:30-18:30

北京时间 3月9日周日 05:30-07:30 a.m


长按二维码免费报名:

令狐冲老师的动态规划总结


  
DP 面试高频题汇总表



题目名称

类型

难度

Word Break

一维

简单

Maximum Product Subarray

一维

简单

Longest Increasing Continuous Subsequence

一维

简单

Perfect Squares

一维

简单

Decode Ways

一维

简单

Best Time to Buy and Sell Stock

一维

简单

Palindrome Partitioning II

一维

中等

House Robber

一维

中等

House Robber II

一维

中等

Decode Ways

一维

中等

Best Time to Buy and Sell Stock III

一维

中等

Longest Increasing Subsequence

一维

Best Time to Buy and Sell Stock IV

一维




Coins in a Line

一维+博弈

简单

Coins in a Line II

一维+博弈

中等




Longest Common Subsequence

二维

简单

Triangle

二维

简单

Minimum Path Sum

二维

简单

Minimum Adjustment Cost

二维

中等

Edit Distance

二维

中等

Maximal Square

二维

中等

Maximum Subarray III

二维

k sum

二维

Maximal Rectangle

二维




Paint Fence

二维(一维+状态)

中等

Paint House

二维(一维+状态)

中等

Paint House II

二维(一维+状态)

中等




Interleaving String

二维+字符串

中等

Regular Expression Matching

二维+字符串

Wildcard Matching

二维+字符串




Copy Books

划分

中等

Burst Balloons

区间

Scramble String

区间+字符串




Unique Binary Search Trees II

树形+计数

简单

Unique Binary Search Trees

树形+计数

简单

Binary Tree Maximum Path Sum

树形

中等




Backpack

背包

简单

Backpack II

背包

中等

Dices Sum

背包

中等




Climbing Stairs

计数+一维

简单

Unique Paths

计数+二维

简单

Unique Paths II

计数+二维

简单

Distinct Subsequences

计数+二维

中等

Backpack VI

计数+背包

中等


令狐冲老师的动态规划总结
 
更多精彩内容
  • 回复“简历”,查看简历撰写指南,获取“简历模板”

  • 回复“冷冻期”,查看北美各大IT企业冷冻期信息和注意事项

  • 回复“Career”, 查看Caireer Fair 攻略 check list

  • 回复“薪资”,查看北美各大IT企业New Grades Engineer 薪资水平;

  • 回复“项目”,查看7-14天可以搞定的小项目推荐

  • 回复“评分”,查看系统设计评分指南

  • 回复“behavior”,查看behavior interview指南

  • 回复“晋升”,查看Engineer晋升机制 


以上是关于令狐冲老师的动态规划总结的主要内容,如果未能解决你的问题,请参考以下文章

1$答疑讲堂 | 令狐冲现场剖析如何学好动态规划,为你解答疑惑

令狐老师为你答疑解惑: 如何掌控Google Facebook高频算法动态规划

算法总结1——动态规划

动态规划总结

关于动态规划算法的总结

专题三-动态规划算法总结