動態規劃最大欄位和

愛學習的阿強發表於2020-10-03

輸入一個整型陣列,陣列中的一個或連續多個整陣列成一個子陣列。求所有子陣列的和的最大值。

要求時間複雜度為O(n)。

示例1:

輸入: nums = [-2,1,-3,4,-1,2,1,-5,4] 輸出: 6 解釋: 連續子陣列 [4,-1,2,1] 的和最大,為
6。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        vector<int> dp(n,0);
        dp[0]=nums[0];
        for(int i=1;i<n;i++){
            dp[i]=max(dp[i-1]+nums[i],nums[i]);
        }
        sort(dp.begin(),dp.end());
        for(auto it:dp){
            cout<<it<<" ";
        }
        return dp[n-1];
    }
};

狀態轉移方程

dp[i]:代表以nums[i]結尾的最大欄位和。
dp[i]=max(dp[i-1]+nums[i],nums[i]),根據定義nums[i]必選,則看看dp[i-1]是否要加。
結果返回dp中的最大元素

優化方法

用pre儲存dp[i-1],用max記錄截止目前最大的欄位和。
#include<limits.h>

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int pre=0;//用來記錄當前的最大欄位和
        int Max=nums[0];
        for(auto &it:nums){
            pre=max(pre+it,it);
            Max=max(Max,pre);
        }
        return Max;

    }
};

相關文章