DP 与 贪心 的区别

来源:互联网 发布:网络媒介有哪些类型 编辑:程序博客网 时间:2024/06/06 14:27

 

背包与动规的区别

 

 

很多同学在做动规题的时候,很容易做成贪心,的确,动规和贪心是很相近的,

在很多时候,

动规和贪心没有明显的界限,

反而在很多时候,

我们需要使用贪心的思想,

对动规进行优化,

不过这也就导致了很多同学分不清什么题是动规,什么题是贪心。

 

 

现在我们来回忆一下,动规的思想是什么,以前一个或者多个状态的最优值,

加上现在这个状态的最优解,

在其中取得当前的最优解,再层层递推,得到最终答案。

 

 

那么贪心呢??

 

贪心的思想是由局部的最优解进行组合,使用分治的思想,局

部的最优解组合起来就得到了总得最优解。

 

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

 

没错,在贪心中,每一个局部的最优解之间是没有任何联系的,

我们可以分开同时求解,

而在动态规划中,

我们必须要应用前面的阶段中的最优值,才可以得到当前的最优值。

 

所以在区别动归和贪心的时候,关键就是:

 

我们在得到当前最优解的时候,需不需要使用前面的阶段中的

得到的值,如果不需要,那就是贪心;如果需要,就是动归。

 

下面我举一道题来说明,这是非常基础的一道题,每一个人都

见过,数字三角形。

 

现在有一个数字三角形,我们从最上方走到最下方。比如下面

这个数字三角形

 

        7

      3  8

     8  1  0


如果我不给出一个点只能走到左下或者右下这个限制条件,我

们可以从这一层的一个点走到下一层的任意一个点,

那么我们发现这

道题就是一个很简单的贪心,

 

取出每一排的最大的数字相加就是我们的和。

 

如果加上了那个条件呢???

 

那么我们就必须使用动态规划,方程很简单

f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j]; 

为什么加上一个条件后,就变成了动态规划呢??

 

因为我们加上了这个条件之后,

我们走到当前这一个层的时候,

 

受到了前面走到的节点的限制,我们必须要依赖于前面走到的节点,

才能够走到当前的节点,所以这道题就不是贪心,而是动归。

 

贪心可以保证一次最优,而动规可以保证整体最优,

 

大家清楚了吗?

 

接下来有一句话,送给喜欢贪心的同学:

 

贪心不能解决动归,动归可以解决贪心

1 0