纯干货分享4大解题套路,从此告别动态规划!

Posted 九章算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纯干货分享4大解题套路,从此告别动态规划!相关的知识,希望对你有一定的参考价值。


九章算法《动态规划专题》金牌讲师

清华大学全国算法竞赛金牌,ACM国际大学生程序设计竞赛全球总决赛选手,FLAG资深面试官。


动态规划题目类型多,难度高,没有固定模板,死记硬背没用。

作为大厂高频面试题,动态规划问题的识别与解决一直是难点所在,往往也是决定面试成功与否的最终关卡。

不过不用怕,我总结了解决动态规划类问题的4步套路,分享给大家。

先备一份见面礼—— 7.2个G的5月最新大厂求职资料 ,感兴趣的同学可以长按识别白嫖~望笑纳

侯卫东的见面礼



礼包部分内容,领取方式见文末


4步套路,解决动态规划问题



1、确定问题状态
     - 提炼最后一步
     - 子问题转化
2、转移方程,把问题方程化
3、按照实际逻辑设置初始条件和边界情况
4、确定计算顺序并求解

结合实例感受下。

你有三种硬币,分别面值2元,5元和7元,每种硬币都有足够多。买一本书需要27元。如何用最少的硬币组合正好付清,不需要对方找钱?

关键词“用最小的硬币组合正好付清”——“最小的组合”,求最值问题,动态规划。

正常人第一反应思路:
最少硬币组合?
优先使用大面值硬币——7+7+7+5=26 额?可求解目标是27啊……
改算法——7+7+7+2+2+2=27,总共用了6枚硬币正好27元.
实际正确答案:7+5+5+5+5=27,才用了5枚硬币。
所以这里贪心算法是不正确的。

套路用起来。

第一步,确定问题状态。
动态规划问题求解需要先开一个数组,并确定数组的每个元素f[i]代表什么,就是确定这个问题的状态。
类似于解数学题中,设定X,Y,Z代表什么。

A、确定状态首先提取【最后一步】

最优策略必定是K枚硬币a1, a2,…, aK 面值加起来是27。

找出不影响最优策略的最后一个独立角色 ,这道问题中,那枚最后的硬币“aK”就是最后一步。
aK提取出来, 硬币aK之前的所有硬币面值加总是27- aK
因为总体求最硬币数量最小策略,所以拼出27- aK 的硬币数也一定最少(重要设定)。
【纯干货分享】4大解题套路,从此告别动态规划!

B、转化子问题。
最后一步aK提出来之后,我们只要求出“最少用多少枚硬币可以拼出27- aK”就可以了。

这种与原问题内核一致,但是规模变小的问题,叫做子问题。

为简化定义,我们设状态f(X)=最少用多少枚硬币拼出总面值X。
我们目前还不知道最后的硬币aK面额多少,但它的面额一定只可能是2/5/7之一。
如果aK是2,f(27)应该是f(27-2) + 1 (加上最后这一枚面值2的硬币)
如果aK是5,f(27)应该是f(27-5) + 1 (加上最后这一枚面值5的硬币)
如果aK是7,f(27)应该是f(27-7) + 1 (加上最后这一枚面值7的硬币)
除此以外,没有其他的可能了。

至此,通过找到原问题最后一步,并将其转化为子问题。
为求面值总额27的最小的硬币组合数的状态就形成了,用以下函数表示:

f(27) = min{f(27-2)+1, f(27-5)+1, f(27-7)+1}
【纯干货分享】4大解题套路,从此告别动态规划!

第二步,转移方程,把问题方程化。

f[X] = min{f[X-2]+1, f[X-5]+1, f[X-7]+1}
(动态规划都是要开数组,所以这里改用方括号表示)

实际面试中求解动态规划类问题,正确列出转移方程正确基本上就解决一半了。

但是请问:这与递归有什么不同??

递归的解法:
     
       
       
     
// f(X)返回最少用多少枚硬币拼出X int f(int X) { // 0元钱只要0枚硬币 if (X == 0) return 0; // 初始化用无穷大(为什么是正无穷?) int res = MAX_VALUE; // 最后一枚硬币是2元 if (X >= 2) { res = Math.min(f(X – 2) + 1, res); } // 最后一枚硬币是5元 if (X >= 5) { res = Math.min(f(X – 5) + 1, res); } // 最后一枚硬币是7元 if (X >= 7) { res = Math.min(f(X – 7) + 1, res); } return res; }
执行图如下:
【纯干货分享】4大解题套路,从此告别动态规划!
要算f(27),就要递归f(25)、f(22)、f(20),然后下边依次递归……(三角形表示)。

【纯干货分享】4大解题套路,从此告别动态规划!
问题明显——重复递归太多。

这是求f(27),还可以勉强递归。如果求f(100)呢?简直是天文数字。最终结果就是递归超时。

求总体最值,一定优先考虑动态规划
不要憨憨的去递归。


插入一下~

需要掌握的动态规划面试解题技巧还包括坐标型、位操型、序列型、博弈型、背包型、双序列以及一些高难面试题解。


本文篇幅有限无法逐一讲清,大家来白嫖我的在线分享吧(纯干货)。


白嫖方式:

长按扫码 — 跳转页面左下 —【 免费试听 】按钮即可

以上是关于纯干货分享4大解题套路,从此告别动态规划!的主要内容,如果未能解决你的问题,请参考以下文章

告别动态规划,连刷40道动规算法题,我总结了动规的套路

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

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

算法题套路总结(三)——动态规划

蓝桥杯BFS从此搞懂搜索题的套路! | 入门必看

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