贪心与动态规划的区别

来源:互联网 发布:几种统计软件 编辑:程序博客网 时间:2024/06/13 09:21

 贪心与动规的区别 

关键:

  看是否用到之前的最优解,如果用到就是动态规划,否则就是贪心,贪心无法解决动态规划的问题,但是动态规划能解决贪心的问题

 
很多同学在做动规题的时候,很容易做成贪心,的确,动规和贪心是很相近的,在很多时候,动规和贪心没有明显的界限,反而在很多时候,我们需要使用贪心的思想,对动规进行优化,不过这也就导致了很多同学分不清什么题是动规,什么题是贪心。 
 
现在我们来回忆一下,动规的思想是什么,以前一个或者多个状态的最优值,加上现在这个状态的最优解,在其中取得当前的最优解,再层层递推,得到最终答案。 
 
那么贪心呢??  
贪心的思想是由局部的最优解进行组合,使用分治的思想,局部的最优解组合起来就得到了总得最优解。 
 
仔细对比两种思想,你发现两者之间有什么差别了吗??  
没错,在贪心中,每一个局部的最优解之间是没有任何联系的,我们可以分开同时求解,而在动态规划中,我们必须要应用前面的阶段中的最优值,才可以得到当前的最优值。 
所以在区别动归和贪心的时候,关键就是:  
我们在得到当前最优解的时候,需不需要使用前面的阶段中的得到的值,如果不需要,那就是贪心;如果需要,就是动归。
 
 
下面我举一道题来说明,这是非常基础的一道题,每一个人都见过,数字三角形。 
 
现在有一个数字三角形,我们从最上方走到最下方。比如下面这个数字三角形 
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个整数为齐王的马的速度。  【输出格式】 

仅有一行,为田忌赛马可能赢得的最多的钱,结果有可能为负。 

【输入样例】 


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

最后再次重申一句话: 
贪心是局部的最优解,动规是整体的最优解
0 0
原创粉丝点击