首页 > 代码库 > 动态规划与贪心算法区别以及如何思考动态规划

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

动态规划和贪心算法的区别
动态规划和贪心算法都是一种递推算法 
均有局部最优解来推导全局最优解 

不同点: 
贪心算法: 
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;
}