[LeetCode]maxSubArray(最大子序列和!!!!)
阿新 • • 發佈:2019-02-17
經典dp問題
有兩種問法,
1、如果最大子序列和是負數,則輸出最大的負數
2、如果最大子序列和是負數,則輸出0
第一個和第二個問題其實可以統一,如果輸出的最大數為負數,將其變成0即可。
動態方程:
最大子序列和是連續的子序列
ThisSum[i]表示第i處,以A[i]結尾的子序列的最大和。
則狀態方程為ThisSum[i]=max(ThisSum[i-1]+nums[i],nums[i])
也即是說,如果ThisSum[i-1]<0則ThisSum[i]就是nums[i],否則ThisSum[i]=nums[i]+ThisSum[i-1](因為是以i結尾的
int maxSubArray(int * nums, int numsSize) {
int maxSum=nums[0],thisSum=nums[0];
int i;
for(i=1; i<numsSize; ++i){
if(thisSum<0)
thisSum=nums[i];
else
thisSum+=nums[i];
if(thisSum>maxSum)
maxSum = thisSum;
}
//if(maxSum<0)
// maxSum = 0;
return maxSum;
}
上面的例子是輸出最大的負數。
稍加修改,同時輸出起始和終止點
int maxSubArray(int* nums, int numsSize, int &l, int r) {
int maxSum=nums[0],thisSum=nums[0];
int i;
int new_l;
for(i=1; i<numsSize; ++i){
if(thisSum<0){
thisSum=nums[i];
new_l=i;
}
else
thisSum+=nums[i];
if(thisSum>maxSum){
maxSum = thisSum;
l = new_l;
r = i;
}
}
//if(maxSum<0)
// maxSum = 0;
return maxSum;
}