贪心和动规的difference

2024-03-20 00:18
文章标签 贪心 difference 动规

本文主要是介绍贪心和动规的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个整数为齐王的马的速度。  

【输出格式】  仅有一行,为田忌赛马可能赢得的最多的钱,结果有可能为负。 

【输入样例】  

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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827679

相关文章

贪心推公式——AcWing 125. 耍杂技的牛

贪心推公式 定义 贪心算法是一种在每一步选择中都采取在当前状态下最优的选择,希望通过局部的最优选择来得到全局最优解的算法策略。 运用情况 问题具有最优子结构,即一个问题的最优解包含其子问题的最优解。可以通过局部最优决策逐步推导到全局最优。问题的选择策略相对明确且易于计算。 注意事项 贪心算法并不总是能得到全局最优解,可能会陷入局部最优。对于一些复杂问题,需要谨慎验证其正确性。可能需要对

OSS报错The difference between the request time and the current time is too large

目录 一、问题描述二、问题原因三、解决方法 一、问题描述 文件上传阿里云 OSS 报错: The difference between the request time and the current time is too large 二、问题原因 请求发起的时间超过 OSS 服务器当前时间 15 分钟,OSS 判定该请求无效,返回报错。 三、解决方法 OSS

代码随想录第31天|贪心算法

134. 加油站 参考 思路: 以每个油站相差作为判断, 比如: gas [5 8 2 8]cost [6 5 6 6] [-1 3 -4 2] 错误 : 把相差最大点当作起点判断能否绕一圈 : 相加数组是否小于0局部最优: 当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行全局最优: 找到可以跑一圈的起始位置 class

贪心算法—

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。这种算法并不总是能找到全局最优解,但在某些问题上能提供足够好的解决方案。贪心算法的关键特性包括: 局部最优选择:在每一步决策时,都选择当前看来最佳的解决方案,不考虑长远的影响。无后效性:过去做出的选择不会影响未来的选择,也就是说,当前的最优选择不会因为之前做了

算法之广度优先,深度优先,拓扑,贪心,并查集

文章目录 1 图算法1.1 广度优先搜索1.2 深度优先搜索1.3 拓扑排序1.4 贪心算法1.4.1 定义1.4.2 示例 1.5 并查集(不相交集合数据结构)1.5.1 并查集讲解1.5.2 Kruskal算法1.5.3 Prim算法 1.8 Bellman-Ford算法 1 图算法 地图数据常常可以用图(Graph)这类数据结构表示,那么在图结构中常用的搜索算法也可以应用

贪心+动归1

​​​​​​​​​​​​​​跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 class Solution {public boolean canJump(int[] nums) {// 跳跃覆盖范围究竟可不可以覆盖到终点!//

[POJ 3764] The xor-longest Path (Tire树 + 贪心)

POJ - 3674 题意是给你一个树,每条边有一个权值,求得树上一条路径,使路径上每条边权值的异或和最大 首先用一个 DFS把根到任意点的路径的异或和求出来 xorv[i] 由异或的性质可得点 u和点 v的异或和即为 xorv[u]^xorv[v] ( 根到两点 LCA的异或和会消去) 然后问题就转化成在区间内找两个值,使得他们的异或和最大 与 LightOJ - 1269一样的做法,

[POJ 3045] Cow Acrobats (贪心)

POJ - 3045 有若干头牛叠罗汉,每头牛有一个冒险值,为在其上面所有牛的重量,减去其力量值 问如何使得最大的冒险值最小 挑战上面的题,本来想着用二分答案的方法做 虽然觉得自己的思路没什么问题,但是 WA了 百度了一发题解,发现这题正解是贪心 首先直观感觉力量大的,体重轻的应该在下面,但这有两个因素,不好确定 可利用调整法试图找出答案 假设我已经找到了答案排列 ( 猜想答案序列

[POJ 1862] Stripies (贪心)

POJ - 1862 有若干个生物,有自己的质量,两个生物碰撞后, 生成一个新的生物质量为 2*sqrt(m_1*m_2) 贪心策略是尽可能地让大的生物先碰撞 这样较大的数可以被多次开方 由于 N比较小,生成的新生物冒泡排序一下就好了 #pragma comment(linker, "/STACK:102400000,102400000")#include <cstdio>

[POJ 3040] Allowance (贪心)

POJ - 3040 FJ手中有若干面值的货币,小面值的货币能被大面值的整除 每周他要给奶牛发不少于 C的工资,问最多能发几周 首先大于 C的面值都先发掉 然后优先发剩下的大面额的货币,当超过时 将最后一个大面额的用尽可能小的货币代替 #pragma comment(linker, "/STACK:102400000,102400000")#include <cstdio>