求最大子数组问题

问题:

给定一个整数序列A,序列中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。

解法:

第一种:

暴力枚举所有的子数组,然后比较选出最大,时间复杂度O(n^2)

第二种:

分治法,参见算法导论,时间复杂度O(nlogn)

第三种:

动态规划,时间复杂度O(n)

1、第一层动态规划:最大子数组由于是连续的,所以肯定有一个起点和一个终点,可以考虑起点终点落下的位置,如A[1..j+1]中,起点终点可以同时落入A[1,j]中,也可以终点始终在A[j+1],起点落在A[1..j]中。最终得到A[1..j+1]的最大子数组为:max{A[1..j] , A[i,j+1](1<=i<=j+1)的最大值},用max记录A[1..j]

2、第二层动态规划:A[i,j+1](1<=i<=j+1)的最大值就是以A[j+1]结尾的最大子数组。设K[j+1]为以A[j+1]结尾的最大子数组,考虑K[j]与K[j+1]之间的关系,以A[j+1]结尾的最大子数组肯定包含A[j+1],所以只需考虑是否包含其前面的K[j],如果K[j]>0则会包含。最终得到K[j+1]=K[j]>0?A[j+1]+K[j]:A[j+1],用tmp记录K[j]

原文地址:https://www.cnblogs.com/littlebugfish/p/4321696.html