一)问题描述:
给定长度为n的整数序列,a[1...n], 求[1,n]某个子区间[i , j]使得a[i]+…+a[j]和最大.求出最大的这个和.例如(-2,11,-4,13,-5,2)的最大子段和为20,所求子区间为[2,4].规定当所有整数都是负数时,最大字段和为0
二)问题分析 :
1、确定规划数组的意义:res[i]表示当以第i个数结尾时的最大字段和。(一定注意数组性质是以第i个数结尾的)
2、状态转移方程:F=Max(res[i-1]+arr[i],arr[i])。
- 由上述可以看出:
- 当res[i-1]<=0时,以i结尾的最大字段和肯定是其本身。
- 当res[i-1]>0时,最大字段和肯定是res[i-1]+arr[i]。
3、由于最大字段和不一定以最后一个数结尾,所以我们需要用一个max变量来保存最大的那个值。
int[] res=new int[arr.length];
Arrays.fill(res,0);
int max=0;
for (int i = 1; i < arr.length; i++) {
if (res[i-1]>0)
res[i]=res[i-1]+arr[i];
else
res[i]=arr[i];
if (res[i]>max){
max = res[i];
}
}
return max;