题目描述:
HZ偶尔会拿些专业问题来忽悠拿些非计算机专业 的同学。今天测试组开完会后,他又发话了: * 在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候问题很 * 好解决。但是,如果向量中包含负数,是否应该包含某个负数,并且期望旁边的整数会弥补它呢? * 例如:{6,-3,2,7,-15,1,2,2},子向量的最大和为8(从第0个开始,到第三个为止) * 给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)
解题思路:
状态: * 子状态:长度为1,2,3,...,n的子数组的和的最大值 * F(i):长度为i的子数组和的最大值,这种定义不能形成递推关系,舍弃 * F(i):以arr[i]为末尾元素的子数组和的最大值 * * 状态递推: * F(i)=max(F(i-1)+arr[i],arr[i]) * F(i)=(F(i-1)>0)?F(i-1)+arr[i]:arr[i] * * 初始值:F(0)=arr[0] * 返回结果: * maxsum:所有F(i)中的最大值 * maxsum=max(maxsum,F(i))
代码:
public static int FindGreatestSumOfSubArray(int[] arr){
if(arr.length == 0 || arr== null) return 0;
//F(i)初始化-->初始值
int sum=arr[0];
//maxsum初始化
int maxSum=arr[0];
for(int i=1;i<arr.length;i++){
//F(i)=(F(i-1)>0)?F(i-1)+arr[i]:arr[i]
sum=(sum>0)?sum+arr[i]:arr[i];
//maxSum=max(maxSum,F(i))
maxSum=(sum<maxSum)?maxSum:sum;
}
return maxSum;
}