标签:
最大子序列
给定一个实数序列x1,x2,x3.......xn,寻找一个连续的子序列xi......xj使其数组之和在所有连续子序列数值之和中时最大的,这个子序列称为最大子序列。 集合中数都是负数,则最大子序列为空,空的子序列之和为0
归纳假设:已知规模小于n的的序列的最大子序列.
问题变为T={x1,x2,......x(n-1)}中找到了最大子序列P={xi....xj},求S={x1,x2,x3.......x(n-1),x(n)}(n>1)的最大子序列。
在上一步由于只知道T的最大子序列P是不够的,x(n)只能扩展一个以n-1结束的子序列——即T的后缀序列. 设想我们把归纳假设增强到包括最大后缀的信息,L={x(k)......x(n-1)},那么S的最大子序列便可求
增强归纳假设: 已知规模小于n的序列的最大子序列,以及作为后缀的最大子序列,知道最大后缀子序列后则S的最大子序列可求。
根据推导过程写出算法
private static int Maxseq(int []arr) { int suffixMax = 0; int globalMax = 0; for (int i = 0; i < arr.Length; i++) { if (suffixMax + arr[i] > globalMax) { suffixMax = suffixMax + arr[i]; globalMax = suffixMax; } else if (suffixMax + arr[i] < 0) { suffixMax = 0; } else { suffixMax = suffixMax + arr[i]; } } return globalMax; }
然后对算法进行精简:
private static int Maxseq(int []arr) { int suffixMax = 0; int globalMax = 0; for (int i = 0; i < arr.Length; i++) { if (suffixMax + arr[i] > 0) { suffixMax = suffixMax + arr[i]; } else { suffixMax = 0; } if (globalMax < suffixMax) { globalMax = suffixMax; } } return globalMax; }
标签:
原文地址:http://www.cnblogs.com/phenixyu/p/5399228.html