本文主要是介绍贪心和动规的difference,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
很多同学在做动规题的时候,很容易做成贪心,的确,动规和贪心是很相近的,在很多时候,动规和贪心没有明显的界限,反而在很多时候,我们需要使用贪心的思想,对动规进行优化,不过这也就导致了很多同学分不清什么题是动规,什么题是贪心。
现在我们来回忆一下,动规的思想是什么,以前一个或者多个状态的最优值,加上现在这个状态的最优解,在其中取得当前的最优解,再层层递推,得到最终答案。
那么贪心呢?贪心的思想是由局部的最优解进行组合,使用分治的思想,局部的最优解组合起来就得到了总得最优解。
仔细对比两种思想,你发现两者之间有什么差别了吗?
没错,在贪心中,每一个局部的最优解之间是没有任何联系的,我们可以分开同时求解,而在动态规划中,我们必须要应用前面的阶段中的最优值,才可以得到当前的最优值。
所以在区别动归和贪心的时候,关键就是:我们在得到当前最优解的时候,需不需要使用前面的阶段中的得到的值,如果不需要,那就是贪心;如果需要,就是动归。 下面我举一道题来说明,这是非常基础的一道题,每一个人都见过,数字三角形。 现在有一个数字三角形,我们从最上方走到最下方。比如下面这个数字三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
如果我不给出一个点只能走到左下或者右下这个限制条件,我们可以从这一层的一个点走到下一层的任意一个点,那么我们发现这道题就是一个很简单的贪心,取出每一排的最大的数字相加就是我们的和。 如果加上了那个条件呢??? 那么我们就必须使用动态规划,方程很简单f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j]; 为什么加上一个条件后,就变成了动态规划呢?? 因为我们加上了这个条件之后,我们走到当前这一个层的时候,
受到了前面走到的节点的限制,我们必须要依赖于前面走到的节点,才能够走到当前的节点,所以这道题就不是贪心,而是动归。 贪心可以保证一次最优,而动规可以保证整体最优, 大家清楚了吗? 接下来有一句话,送给喜欢贪心的同学:贪心不能解决动归,动归可以解决贪心。
最后我们来回忆一下当初同学们都以为是贪心的一道题,田忌赛马:
田忌赛马
【问题描述】 中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢取最多的钱?
【输入格式】 第一行为一个正整数n (n <= 2000) ,表示双方马的数量。 第二行有N个整数表示田忌的马的速度。 第三行的N个整数为齐王的马的速度。
【输出格式】 仅有一行,为田忌赛马可能赢得的最多的钱,结果有可能为负。
【输入样例】
3
92 83 71
95 87 74
【输出样例】
200
当初同学们在思考这道题的时候大都认为这是一道贪心,自己的马如果能胜,就用最大的一匹取胜,如果不能,就用最差的那匹取输,这种思想看似有理,但是有一个很简单的道理,存在平局。 所以赢得多,可能输得越多,赢得少,可能输得少。 所以,简单的相加不能够得到我们的最优解,我们发现这种策略存在明显的动态规划特征。
由于齐王的马的出场顺序是确定的,所以前面的马的安排不会影响到后面的对决,前面得到的最优解加上现在对决的最优解就是当前的最优解,最优子问题,无后效性,都存在,所以这一定是一道动规。 线性?区间?背包? 很明显,这是一道区间的问题,i到j这一个区间的最优值是不是其中的一匹马去对战齐王的第j-i匹马的结果加上剩下的马去对战齐王的j-i-1匹马的最大值的最大值。 那么贪心就完全没用了吗??? 我说过贪心可以优化动规,因为动规本来就满足最优子问题结构,使用贪心的思想,在求最优子问题的时候,可以省下不少的时间.
在这道题中,当我们在i到j这个区间内选派马去和齐王的j-i这匹马对战的时候,我们使用前面得到的贪心策略, 1. 用最大的马 2. 用最小的马 我说过,贪心在一次的决策中可以保证是最优的 所以无论如何,这样的策略在这一次决策中一定是最优的,这样我们就使用贪心策略清楚地解决了动规的最优子问题。 f[i][j]代表田忌的第i到第j匹马对战齐王的前j-i匹马得到的最大值. F[i][j]=max{f[i+1][j]+cost[i][j-i],f[i][j-1]+a[j][j-i]};
最后再次重申一句话: 贪心是局部的最优解,动规是整体的最优解
这篇关于贪心和动规的difference的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!