1首先看一下 最大子序列。
最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。你已经看出来了,找最大子序列的方法很简单,只要前i项的和还没有小于0那么子序列就一直向后扩展,否则丢弃之前的子序列开始新的子序列,同时我们要记下各个子序列的和,最后找到和最大的子序列。
方法:动态规划 O(n)
令b[j]表示从a[0]~a[j]的最大子段和。
b[j]的当前值只有两种情况:
(1) 最大子段一直连续到a[j]
(2) 以a[j]为起点的子段
b[j]=max{b[j-1]+a[j], a[j]}
/**
* int数组和最大的子序列
* 比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。
* 你已经看出来了,找最大子序列的方法很简单,只要前i项的和还没有小于0那么子序列就一直向后扩展
*/
public class IntArrMaxSub {
public int maxSub(int a[])
{
int i,b = 0,sum = 0;
int n = a.length;
for(i = 0;i < n;i++)
{
if(b>0) // 若a[i]+b[i-1]会减小
b += a[i]; // 则以a[i]为首另起一个子段
else
b = a[i];
if(b > sum)
sum = b;
}
return sum;
}
public static void main(String[] args) {
IntArrMaxSub intArrMaxSub = new IntArrMaxSub();
int[] A = {5, -3, 4, 2};
int result = intArrMaxSub.maxSub(A);
System.out.println(result);
}
}