題目描述:
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;
}