1. 程式人生 > >[LeetCode]maxSubArray(最大子序列和!!!!)

[LeetCode]maxSubArray(最大子序列和!!!!)

經典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; }