一、定义
贪心算法,定义为:将一个大的问题拆解为若干个小问题,在求解问题的每一步中,不管当前这一步的决策会对未来有什么影响,都只将眼前的决策取到最优即可。如此反复,直至最终得到最优解。
缺陷:只是希望得到最优解,尽管每一步都是最优解,但在整体上并不一定能够得到最优解。
优点:时间复杂度通常都比较低,也就是花的时间比较少。整体可能不是最优,但也八九不离十。
二、举例
有这么一堆数,按照金字塔排列下来,如下图所示。我们从顶点开始,求从顶部到底部的最大路径之和;换句话说就是从顶到底每层依次加一个数,令这个数字最大。
要是用眼瞅,比较容易能看出来最佳路径是9-7-3-4-5,但是如果数一多,眼瞅就不好使了,此时就得靠代码去算。
有一种解法就是把每一种可能全算出来,暴力爆破,写起来也简单。但显然这样非常耗时耗内存,分分钟卡死计算机,所以这里我们就用到贪心算法。
三、代码
我们将此金字塔数组用a[i][j]表示,简单的写个代码如下:
// 注意,下面的代码只是表意,不能直接扒过去用
// a[i][j]表示数组,maxJ表示数组的最大层数,temp表示临时数值
// maxJ表示总列数,maxI表示当前列的最大行数
for(j=0; j<maxJ; j++){
for(i=0; i<maxI; i++){
temp1 = a[i][j] + a[i][j+1];
temp2 = a[i][j] + a[i+1][j+1];
temp = max(temp1, temp2);
}
maxSum = maxSum + temp;
}
return maxSum;