动态规划与贪心算法区别以及如何思考动态规划

动态规划和贪心算法的区别

动态规划和贪心算法都是一种递推算法

均有局部最优解来推导全局最优解

不同点:

贪心算法:

1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留。

2.由(1)中的介绍,可以知道贪心法正确的条件是:每一步的最优解一定包含上一步的最优解。

动态规划算法:

1.全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解

2.动态规划的关键是状态转移方程,即如何由以求出的局部最优解来推导全局最优解

3.边界条件:即最简单的,可以直接得出的局部最优解

比较明显的一个例子就是找硬币的问题。(具体在网上找找)

==============================================================================

动态规划思考:

1)找状态:一般问题的解就是状态。但是如何问题的解与问题的规模i没有联系时,则要去寻找合适的状态。在找状态时也要遵循状态一定要与问题的规模i有关。不然则不是状态。

2)状态转移方程:把问题的规模缩小至0.从到n,先去求简单的特殊的d[0],d[1],.....然后推出d[i]的求法。

问题描述:该问题就是可以说明贪心和动态规划的区别。在一序列中,找出最长的相邻子序列长度,其中相邻数据差值一正一负的变化。

#include<iostream>
using namespace std;
#define MAXSIZE 100
int result[MAXSIZE];

int len(int *a,int len)
{
        int length=1;
        if(len==1)
                return 1;
        if(len==2)
                return 2;
        result[2]=2;
        int i;
        for(i=3;i<=len;i++)
        {
                if((a[i-1]-a[i-2])*(a[i-2]-a[i-3])<0)
		//每一个当前状态都只于前一个最优子状态相关
		//这就有点是贪心算法了,但此处写的时候还是用的动态规划
                        result[i]=result[i-1]+1;
                else
                        result[i]=2;
                if(result[i]>length)
                        length=result[i];
        }
        return length;
}
int main()
{
        int a[]={1,17,5,10,13,15,10,5,16,8};
        cout<<len(a,10)<<endl;
        return 0;
}

动态规划与贪心算法区别以及如何思考动态规划

时间: 2024-10-14 04:12:13

动态规划与贪心算法区别以及如何思考动态规划的相关文章

分治法、动态规划、贪心算法区别

1.分治法 算法思想:将原问题划分成若干个规模较小而结构与原问题相似的子问题,递归的解决这些子问题,然后再合其结果,就得到原问题的解 特征: 该问题的规模缩小到一定的程度就很容易解决 该问题可以分解为若干个规模较小的相同问题,即改问题具有最优子结构性质 利用该问题分解出的子问题的解可以合并为该问题的解: 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题 2.动态规划 算法思想:与分治法相似,也是通过组合子问题的解而解决整个问题.区别是,动态规划适用于分解得到的子问题往往不是

动态规划和贪心算法的区别

这是转别人的,待会我会自己总结 动态规划和贪心算法的区别动态规划和贪心算法都是一种递推算法 均有局部最优解来推导全局最优解 不同点: 贪心算法: 1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留. 2.由(1)中的介绍,可以知道贪心法正确的条件是:每一步的最优解一定包含上一步的最优解. 动态规划算法: 1.全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解 2.动态规划的关键

从 活动选择问题 看动态规划和贪心算法的区别与联系

这篇文章主要用来记录我对<算法导论> 贪心算法一章中的“活动选择问题”的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题---粗略提下,详细请参考<算法导论> ②活动选择问题的DP(Dynamic programming)求解--DP求解问题的思路 ③活动选择问题的贪心算法求解 ④为什么这个问题可以用贪心算法求解? ⑤动态规划与贪心算法的一些区别与联系 ⑥活动选择问题的DP求解的JAVA语言实现以及时间复杂度分析 ⑦活动选择问题的Gr

数据结构之贪心算法(背包问题的思考)-(十)

贪心策略.关于贪心算法的思考,思考过程都放在代码中了. package com.lip.datastructure; /** *贪心算法:装箱问题的思考 * @author Lip *装箱问题可以是时间调问题的延伸,当一个箱子没有容积限制,那么就是时间调度问题 *在时间调度问题中:存在两个可以讨论的问题.1.平均最短时间 2.总的最短时间 *这两个问题都和装箱问题中问题如此类似. */ /* * 上面是我理解的装箱问题,本来是想说背包问题的 * 背包问题的描述:有N件物品和一个容量为V的背包.第

背包问题:动态规划和贪心算法

1. 动态规划 以下关于动态规划的文字描述来源 动态规划之背包问题(一) 作者:Hawstein 出处:http://hawstein.com/posts/dp-knapsack.html 一切都要从一则故事说起. 话说有一哥们去森林里玩发现了一堆宝石,他数了数,一共有n个. 但他身上能装宝石的就只有一个背包,背包的容量为C.这哥们把n个宝石排成一排并编上号: 0,1,2,-,n-1.第i个宝石对应的体积和价值分别为V[i]和W[i] .排好后这哥们开始思考: 背包总共也就只能装下体积为C的东西

算法复习笔记(分治法、动态规划、贪心算法)

分治法 动态规划 贪心算法 分治法 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的问题,这些子问题互相独立且与原问题相同(所以可以递归).递归地解这些子问题,然后将各个子问题的解合并得到原问题的解.它的一般算法设计模式如下: divide-and-conquer(P) { //|P|表示问题的规模,n0表示阈值,当规模不超过n0时,问题容易解出,不必分解 if(|P|<=n0) adhoc(P); //将P分解成子问题 divide P into smaller subinstanc

活动选择问题 (动态规划 与 贪心算法)

问题描述: 设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi.如果选择了活动i,则它在半开时间区间[si, fi)内占用资源.若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的.也就是说,当si≥fj或sj≥fi时,活动i与活动j相容.活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合. . 从图中

2016-6-19 动态规划,贪心算法练习

DP:1.codevs 1493 糖果 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 最近小修很高兴,因为她的k个外甥就要来她家里玩了.她上超市买了一大堆糖果,总共有n颗. 小修准备把所有的糖果分成k堆(当然每一堆至少要有一颗糖果).可是到底有多少种分法呢? 她冥思苦想不得其解,你能帮助她吗? 输入描述 Input Description 两个用空格分开的整数n, k(n<=60000, k<=100). 输出描述 Outp

【算法复习】分治算法、动态规划、贪心算法

Notes ## 分治思想和递归表达式 [分治思想] 将一个问题分解为与原问题相似但规模更小的若干子问题,递归地解这些子问题,然后将这些子问题的解结合起来构成原问题的解.这种方法在每层递归上均包括三个步骤: divide(分解):将问题划分为若干个子问题 conquer(求解):递归地解这些子问题:若子问题Size足够小,则直接解决之 Combine(组合):将子问题的解组合成原问题的解 [分治递归表达式] 设T(n)是Size为n的执行时间,若Size足够小,如n ≤ C (常数),则直接求解