标签:limits 查看 也会 can ast 简单 .net span process
问题:给一列数n个,求最大连续子序列和(即连续的子序列中和最大的序列)若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素 本文作者 凌风 csdn (iaccepted)
拓展:给一个n*n的矩阵,求其中和最大的子矩阵(即所有子矩阵中和最大的阵)
首先也是从最简单的着手,拿到问题,很容易想到的就是直接爆搜(求所有可能的子序列和并找出最大的即可)时间复杂度为n^2
上面的这段代码思路非常的清晰也便于理解,但是数据量大的话时间消耗也会很大,当然ACM的要求肯定是达不到了,现在做时间复杂度为n的算法来解决该问题。
该算法基于的思想也很简单,最大连续子序列和的第一个元素不可能是负数,这点很好证明(反证),假设a[i…j]为最大的连续子序列且a[i]为负,那我a[i+1…j]的和将会大于a[i…j]的和,所以与原假设矛盾,这就能推出最大子序列和的第一个元素不可能是负数。得到这个结论我们就可以进一步进行推广,那就是如果一个子序列的和为负数,那么这个序列不可能是最大连续子序列中的开始的一段序列(类似于第一个元素的方法可得到证明即把这段和看做是一个元素)。根据这一思想就可以得到本体线性的算法。
至此,最大连续子序列问题得到解决。
下面记录下最大子矩阵和的求法。
其实最大子矩阵和的算法就是最大连续子序列的一个拓展问题,思路很简单,就是将矩阵先预处理下,按列累加,然后通过三个循环变量来遍历所有的子矩阵,对每个子矩阵以列和为元素转化为n个元素序列求最大连续子序列的问题就可以了。
本文作者 凌风 csdn(iaccepted)
作者博客:http://blog.csdn.Net/iaccepted,欢迎交流
标签:limits 查看 也会 can ast 简单 .net span process
原文地址:http://www.cnblogs.com/aabbcc/p/6506502.html