【LeetCode】53. Maximum Subarray 動態規劃、最大子段和

題爲求數列的最大子串和,分析後採用動態規劃策略

最初的想法是用 f[i] 表示 0 到 i 區間的最大子串和,但這樣並不能很好的用當前狀態表示下一狀態,因爲最優的子串可能與下一個數字不連續

進而想到以 f[i] 表示 0 到 i 區間且以nums[i]結尾的最大子串的和,這樣固定了尾部的元素,使子問題靈活性降低,方便求解

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int f[nums.size()];
        int sum = nums[0];
        f[0] = nums[0];
        for(int i=1; i<nums.size(); i++)
        {
            f[i] = max(f[i-1], 0) + nums[i];
        }
        
        for(int i=0; i<nums.size(); i++)
        {
            if(f[i]>sum)
                sum = f[i];
        } 
        return sum;
    }
};

具體的,首先需要初始化,需要注意的是 令最大值爲數列第一個元素

DP方程爲 :f[i] = max(f[i-1], 0) + nums[i];
如果以前一個數字爲結尾的最大子串和小於零,那加上它,以當前數字結尾的子串和一定會變小

最後只要取以不同數字結尾的最大子串和的最大值就好了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章