运营百科

baike

给我一个机会给你讲懂DP_知乎_(dp代运营是什么意思)

iseeyu2个月前 (08-17)运营百科441

在互联网人漫长的刷题历程中,动态规划(Dynamic Program) 绝对是一块绕不开且难啃的硬骨头。然而近年来面试官偏偏喜欢考 dp,且大有递增之趋势。


我也挣扎了很久才勉强摸清楚这类题该怎么思考,看了很多“不讲人话”的书籍和网课后,为了不让你们再经受折磨,总结了一点点心得。


想学啊?我教你啊!


一、动态规划的题目特点

计数有多少种方式走到右下角有多少种方式选出 k 个数使得和是 sum

2. 求最大最小值

从左上角走到右下角的最大数字和求最长上升子序列长度

3. 求存在性

取石子游戏,先手是否必胜能不能选出 k 个数使得和为 sum

4.其他(如博弈论等)

并不是说这三种问题出现了一定是动态规划,也有可能是贪心等等。但是动态规划的题目大部分都是这三种情况,可以往 dp 考虑


二、怎样用动态规划去解题

下文将以 Coin Change 为例,为读者讲述采用动态规划时应该怎么做

动态规划组成部分一:确定状态

状态数组决定了动态规划的状态方程应该怎么写,具有“定海神针”的作用

简单的说,解动态规划时会开一个数组,我们自己要明确 dp[i] 或 dp[i] [j] 是代表什么意思

确定状态需要两个意识

最后一步子问题


1.最后一步

虽然我们不知道最优策略是什么,但是最优策略肯定有 K 枚硬币 a1, a2, ..., ak 加起来面值为27

也就是一定存在最后那一枚硬币 ak

除去这枚硬币以后,前面的硬币加起来面值就变成了 27-ak


关键点1

我们不关心前面的k-1枚硬币怎么样拼出来的27-ak(不管是1种或者是成百上千种 方法拼出来的),而且尽管我们还不知道 ak 和 k 的具体数值,但是我们能够确定前面的硬币是 27-ak


其实这也是传说中的 “无后效性” 的意思,百度百科对于这个词的解释是这样的:

无后效性是指如果在某个阶段上过程的状态已知,则从此阶段以后过程的发展变化仅与此阶段的状态有关,而与过程在此阶段以前的阶段所经历过的状态无关。

感觉是说了句正确的废话。我想用一个例子来说明一下:

假设现在有个棋盘的左上角有颗棋子,只能往右或者往下走,问到右下角有多少种走法。对于某个位置(i,j),我们不关心它是怎么走到这里,只知道它要么从上面来,要么从下面来,且是两条路中更短的一条中来,这就够了。如果换种问法,可以上下左右走,但是不能重复。如此,我们就不得不考虑之前走过了哪些路,这就叫后效性。


关键点2

因为是最优策略,所以拼出27-ak的硬币数一定要最少,否则就不是最优策略

假设前面的硬币只用了 K-2 枚硬币就拼出来了,那么加上最后那一枚就是 K-1 枚硬币,与假设产生了矛盾


关键点3

或许你可能知道这题要用 dp 了,但是却纠结开几维数组? 在没有丰富的刷题经验之前,可以粗暴地这样理解:题目的问题是[多少]个,还是走到 [i] [j] 位置,前者一维,后者二维


2.子问题

基于上述的讨论,我们现在要求的是问题是:最少用多少枚硬币可以拼出27-ak?

而原问题是:最少用多少枚硬币可以拼出27-ak?

可以看到,原问题被转化成了一个子问题,且规模变小了

我们把问题一样,但是规模更小的问题,称之为子问题


然而,我们还不知道最后那枚硬币ak是多少!

可是!最后那枚硬币只可能是2,5,7中的一个啊!

具体 f(27) = 什么呢?因为要求的是最少的硬币数,所以:

f(27) = min(f(27-2), f(27-5), f(27-7)) + 1,加1是因为要算上第 k 枚硬币


到了这里,这题的代码已经可以写了。如果是递归的话,伪代码大致可以写成这样:

public int f(int x){ if(x == 0) return 0; int res = MAX_VALUE; if(x >= 2) res = Min( Min(f(x-2), f(x-5), f(x-7))+1, res); return res; }

不过很明显递归中有大量的重复计算,像这个问题很轻松就可以造成栈溢出


动态规划组成部分二:转移方程

状态f[x] = 最少用多少枚硬币拼出 x

对于任意x,f[x] = min{f[x-2], f[x-5], f[x-7]} + 1


最值型:就会用到min、max;计数型:+++;存在型:or、and


动态规划组成部分三:初始条件和边界情况

边界条件:如果数组的下标小于0怎么办?如f[-1],f[-5],对于本题,我们的策略是如果索引 Y 是负数,我们就让 f[Y] = +∞

所以 f[1] = min{f[-1], f[-4], f[-5]} + 1 = ∞+1 = ∞,表示拼不出来1,符合题意


初始条件:对于本题是f[0] = 0

如果你有一定的刷题经验你会发现,在一些题目中我们会看到有时我们会定义 f[0] ,f[1],f[2] ,这样的初始条件,有时又不会写初始条件

具体何时写呢?

——用状态转移方程算不出来,但是又用得到值的情况时,需要手工定义。

比如这题,f[0] 如果用状态转移方程来算,f[0] = min{f[-2], f[-5], f[-7]} + 1 = ∞+1 = ∞,但是我们明明知道 f[0] 本该等于0,所以需要显示地做出定义。而 0 之后的值就不需要手工定义了


总结来看,初始条件就是定义最小的那些情况,边界条件就是为了不要让数组越界(包括上下溢)


动态规划组成部分四:计算顺序

在前面的概念都搞清楚了是不是就结束了呢?

非也

我们是应该按 f[27],f[26],f[25] 的顺序计算呢,还是按 f[0], f[1], f[2] 的顺序?

对这题来说,我们应该从小到大来计算。而且很多的 dp,包括一维二维都是从小到大,从上到下从左到右来进行递推的

计算顺序的确定只有一个原则,当要计算 f[x] 时,等号右边的式子包含的变量都已经被计算过了

对于这题,f[x] = min{f[x-2], f[x-5], f[x-7]} + 1,那么我们就得保证右边的 f[x-2],f[x-5],f[x-7] 都已经被算过了,否则无法算出 f[x]


时间复杂度:O(N*M),N 是要拼出的面值,M 是硬币数。这一题就是 27 * 3

空间复杂度:O(N),这题就是 O(27)


下面给出这题的代码,注释部分是我一开始出错的(我也不晓得为什么才超 46%,这类题代码大同小异,稍微改进一点就可以超过很多人):

class Solution { public int coinChange(int[] coins, int amount) { int[] dp = new int[amount+1]; // Arrays.fill(dp, -1); 为什么不能用-1呢,因为一直在取min,导致数组内容一直不能被正常更新 Arrays.fill(dp, Integer.MAX_VALUE); // Arrays.fill(dp, amount+1); 也可 dp[0] = 0; for(int i = 1; i <= amount; i++){ for(int j = 0; j < coins.length; j++){ //dp[27] = min(dp[27-1]+1,dp[27-3]+1,dp[27-5]+1) if(i-coins[j]>=0 && dp[i-coins[j]] != Integer.MAX_VALUE){ dp[i] = Math.min(dp[i], dp[i-coins[j]] + 1); } } } return dp[amount] == MAX_VALUE ? -1 : dp[amount]; } }



本题的细节点

数组大小是否开到了 amount+1初始化有没有正确写出 dp[0] = 0顺序:是否是从小到大怎么正确处理 dp数组的初始值(Integer.MAX_VALUE or amount+1都行),可以是别的,但要特殊处理dp 方程有没有写对、边界情况有没有写对

感谢您看到这,下面是我的个人。我会不定期分享一些最近所学(包括但不限于CS)和新的感悟,期待您的关注!

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/758.html

相关文章

组建短视频代运营团队需要什么人?怎么去管理及配置?

代运营其实还是比较宽泛,它包括了广告代投、视频创作、短视频SEO等业务,组建代运营团队总的来说会有以下4个步骤:一、确定关键业务组建短视频代运营团队前你得先确认创始团队的核心优势是什么?比如你们以前就是做广告投放出身的,那关键业务就以广告代投下手,其它不擅长的业务前期可以先外包,没必要组建团队,把业...

天猫六星级代运营排名

天猫六星级代运营排名

为助力品牌实现全消费者生命周期价值以及全货品生命周期价值的最大化,天猫生态服务商正在升级成为品牌数字化转型的长期价值伙伴,服务商以指标-工具-场景解决方案为轴心,将提供更专业的服务模式服务于品牌的数字化转型与升级。今年我们会从全用户和全货品周期价值管理为出发点,升级天猫生态评估模型。基于对品牌增长的...

私域电商AIPL增长模型,打造销售转化闭环

私域电商AIPL增长模型,打造销售转化闭环

编辑导语:关于私域这个话题,行业内已经有众多相关讨论,不少企业也将私域运营作为获客拉新、拉动企业增长的有效方式,私域电商也不例外。本篇文章里,作者对基于AIPL打造的私域电商增长模型做了解读,一起来看一下。越来越多的企业开始重视私域,不管是大企业还是小公司,不管是成熟的品牌还是新锐品牌,私域流量运营...

江苏城乡公交通达率全国第一!村民抬脚进城,快递坐车进村

江苏城乡公交通达率全国第一!村民抬脚进城,快递坐车进村

来源:交汇点新闻客户端交汇点讯 城乡公交一体化是公共交通向农村地区延伸的重要形式,也是城乡基本公共服务均等化的具体体现。在全省基本实现镇村公交全覆盖的基础上,64.4%的行政村实现公交直通县城,全省23个涉农区实现至少一条公交线路直达设区市主城区,国家市场监管总局最新发布的《全国公共服务质量监测情况...

消费4.0时代,如何通过全域增长穿越周期实现可持续增长?

消费4.0时代,如何通过全域增长穿越周期实现可持续增长?

成功的消费零售企业,从来都是能够打通多元的人货场、实现穿越周期的可持续增长,在数字化转型的趋势下,消费零售行业开始进入中国特色的消费4.0时代,即用户为中心的时代。不论新消费还是老消费,本质都是基于用户生命周期的需求满足和体系增长,这也是所有消费零售企业及所有面向C端生意的经营战略。本文将从当下时代...

十亿消费者,谁是下沉市场的孤勇者?

十亿消费者,谁是下沉市场的孤勇者?

本文来自微信公众号:互联网启示录(ID:netmedia),作者:王新宇,头图来源:视觉中国一、站长已死?杭州满觉陇的秋夜微凉,犹如错综复杂的小路在暗黄的灯光下,总是有一种淡淡的迷雾笼罩的感觉,史路引被我约到了山上的一间茶舍,这是一家被社交媒体塑造的非常网红的茶空间。泡茶的小姐姐很温柔的给我们演示用...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片