您的位置:首页 > Web前端

贪心和动规的difference

2014-07-27 22:14 148 查看
很多同学在做动规题的时候,很容易做成贪心,的确,动规和贪心是很相近的,在很多时候,动规和贪心没有明显的界限,反而在很多时候,我们需要使用贪心的思想,对动规进行优化,不过这也就导致了很多同学分不清什么题是动规,什么题是贪心。

现在我们来回忆一下,动规的思想是什么,以前一个或者多个状态的最优值,加上现在这个状态的最优解,在其中取得当前的最优解,再层层递推,得到最终答案。

那么贪心呢?贪心的思想是由局部的最优解进行组合,使用分治的思想,局部的最优解组合起来就得到了总得最优解。

仔细对比两种思想,你发现两者之间有什么差别了吗?

没错,在贪心中,每一个局部的最优解之间是没有任何联系的,我们可以分开同时求解,而在动态规划中,我们必须要应用前面的阶段中的最优值,才可以得到当前的最优值。


所以在区别动归和贪心的时候,关键就是:我们在得到当前最优解的时候,需不需要使用前面的阶段中的得到的值,如果不需要,那就是贪心;如果需要,就是动归。 下面我举一道题来说明,这是非常基础的一道题,每一个人都见过,数字三角形。 现在有一个数字三角形,我们从最上方走到最下方。比如下面这个数字三角形

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]};

最后再次重申一句话: 贪心是局部的最优解,动规是整体的最优解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: