问题描述:
给定n个整数(可能为负数)组成的序列a1,a2,a3,...,an, 求该序列子段和的最大值
例如:
X={-2, 11, -4, 13, -5, -2}, 其最大子段和为20
最大子段为:11,-4,13
解法一:穷举法
列举所有的可能,求其中的最大值
算法实现如下:
/*
* description: 最大子段和问题
* 问题描述:给定n个整数(可能为负数)组成的序列a1,a2,a3,...,an,
* 求该序列子段和的最大值
* 解法一:穷举法,选取其中一个最大的值
*
* auther: cm
* date: 2010/11/19
*/
public class MaxSubSum
{
//穷举法
public static int maxSubSum1(int[] a)
{
int maxSum = 0;
for (int i = 0; i < a.length; i++)
{
for (int j = i; j < a.length; j++)
{
int sum = 0;
for (int k = i; k <= j; k++)
{
sum += a[k];
}
if (sum > maxSum)
{
maxSum = sum;
}
}
}
return maxSum;
}
//穷举法改进,减少一层循环
public static int maxSubSum2(int[] a)
{
int maxSum = 0;
for (int i = 0; i < a.length; i++)
{
int sum = 0;
for (int j = i; j < a.length; j++)
{
sum += a[j];
if (maxSum < sum)
{
maxSum = sum;
}
}
}
return maxSum;
}
public static void main(String[] args)
{
int[] a = {-2, 11, -4, 13, -5, -2};
//System.out.println(MaxSubSum.maxSubSum1(a));
System.out.println(MaxSubSum.maxSubSum2(a));
}
}