设为首页 加入收藏

TOP

求最大子序列和
2014-11-23 19:19:34 】 浏览:245
Tags:最大 序列

问题:给定整数序列S[0],S[1],... S[N-1],子序列和是指S[i]+S[i+1]+...+S[j-2]+S[j-1],其中i,j, 0<= i <= j <= N-1,求所有这样的子序列和的最大值,即最大子序列和。


方法一:枚举法 O(N^2)


求出所有的子序列和,取其最大值。算法复杂度为O(N^2)。


int maxSubSeq1(int a[], int len)
{
int maxSum;
int i, j;

if (len <= 0) return MIN_INT; /* MIN_INT可取足够小的整数 */

maxSum = a[0];
for (i = 0; i < len; ++i) {
int thisSum = 0;
for (j = i; j < len; ++j) {
thisSum += a[j];
maxSum = (thisSum > maxSum thisSum : maxSum);
}
}
return maxSum;
}


方法二:动态规划 O(N)


这个问题可以采用动态规划来解答。假设对N个数的序列S[0…N-1],最大子序列和为F(N),令M(N)为包含S[N-1]的最大子序列和。当已求得F(N-1)时,考虑S[N-1],最大子序列可能有以下两种情况,一是包括S[N-1],一是不包括S[N-1]。不包括S[N-1]时,F(N) = F(N-1);包括S[N-1]时,F(N) = M(N)。


所以 F(N) = max{ F(N-1), M(N) }。


现在的问题就剩下求M(N)了,而 M(N) = max{ M(N-1)+S[N-1], S[N-1] }


即,M(N) = (M(N) > 0 (M(N) + S[N-1]) : S[N-1]);


算法复杂度为O(N)


int maxSubSeq2(int a[], int len)
{
int maxSum, lastMaxSum;
int i;

if (len < 0) reutrn MIN_INT; /* MIN_INT可取足够小的整数 */
maxSum = a[0];
lastMaxSum = a[0];
for (i = 1; i < len; ++i) {
lastMaxSum = (lastMaxSum > 0 lastMaxSum + a[i] : a[i]);
maxSum = (lastMaxSum > maxSum lastMaxSum : maxSum);
}
return maxSum;
}


C语言梳理一下,分布在以下10个章节中:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇最简单的C语言程序一例 下一篇用C语言实现简单的栈

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目