动态规划和贪心算法的区别
动态规划和贪心算法都是一种递推算法
均有局部最优解来推导全局最优解
不同点:
贪心算法:
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