考虑数组的第一个元素a[0],以及最大的一段数组的一段数组(a[i]...a[j])
有:
1. 当0=i=j时,a[0]就是最大的一段
2.当0=i<j时,和最大的一段由a[0]开始
3.当0<i时,a[0]和最大的一段无关
由此类推,可以将一个大问题(n个元素数组)转化为一个小问题(n-1个元素)
假设知道a[1]...a[n-1]中最大的一段数组之和为all[1],包含a[1]的最大一段数组为start[1]
由此可见,问题的解all[0]由max(a[0],a[0]+start[1],all[1])得到
用动态规划的方法来解决:
public static int MaxSum(int[] a){ int len=a.length; int start=a[len-1]; int all=a[len-1]; for (int i=len-2;i>=0;i--){ start=Math.max(a[i],start+a[i]); all= Math.max(all,start); } return all; }