贪心法与动态规划

来源:互联网 发布:购物车程序java 编辑:程序博客网 时间:2024/05/16 19:54

贪心算法:

连续数之和最大值(max sum

 题目大意:

给出一个长度为N的数列(数列中至少有一个正数),要求求出其中的连续数之和的最大值。(也可以加入ab来限制连续数的长度不小于a且不大于b)。

解题思路:

先说不加限制的那种,定义一个统计变量tot,然后用循环进行如下操作:inctotitem其中如果出现tot<0的情况,则将tot赋值为0。在循环过程之中tot出现的最大值即为答案。

如果加入了限制条件的话,问题就变得难一些了(这句真的不是废话)。为此我们先定义数组sum[i]来表示code[1]code[i]之和(这样的话code[a]~code[b]的和我们就可以用sum[b]-sum[a-1]来表示了)。

 再维护一个数组hash[i]来表示满足条件的sum[a-1]的下标,并使之按递增顺序排列,这样当前以第i的数为终止的数列的最大值肯定就是sum[i]-sum[hash[1]]

 

现在我们来讨论hash数组之中的数据需要满足的条件和如何维护的具体问题:

当考虑到以第i个数为结尾时,hash[i]所表示的下标需要满足的第一个条件就是题目规定的长度限制,我们需要实时的加入满足长度规定的下标,删除不符合要求的下标。其次,与不加限制条件时相同,若sum[i]-sum[hash[1]]的值小于零,则清空数组hash

维护时可以这样,当考虑到第i个数时,我们就将下标i-a+1加入到hash中,因为hash中原来已经排好序,因此我们我们可以用插入排序来维护hash的递增性,然后我们考察hash[1],若hash[1]<i-b+1,则证明其已超出长度限制,我们就将其删除,接着再考虑更新后的hash[1],如此重复直至找到一个满足条件的hash[1]为止。

我们可以用链表来表示hash,这样就可以减少数据加入和删除时频繁数据移动的时间消耗。

记录下sum[i]-sum[hash[1]]的最大值即为答案。

动态规划算法:矩阵连乘

http://blog.163.com/zhe_wang_2009/blog/static/1722821212011926855333/ 

胜负未分 SVD 奇异值分解

贪心算法当然也有正确的时候。求最小生成树的Prim算法和Kruskal算法都是漂亮的贪心算法。
贪心法的应用算法有Dijkstra的单源最短路径和Chvatal的贪心集合覆盖启发式
所以需要说明的是,贪心算法可以与随机化算法一起使用,具体的例子就不再多举了。其实很多的智能算法(也叫启发式算法),本质上就是贪心算法和随机化算法结合——这样的算法结果虽然也是局部最优解,但是比单纯的贪心算法更靠近了最优解。例如遗传算法,模拟退火算法。

0 0
原创粉丝点击