问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为三角形高度),而使用动态规划的话,则时间复杂度降低到