1. 程式人生 > 實用技巧 >最大連續子段和問題(動態規劃/貪心)

最大連續子段和問題(動態規劃/貪心)

最大連續子段和問題

傳送門

問題描述

給定一個數組,記錄一串數字,且元素值即存在正數也存在負數,現在要你求出陣列中最大的連續子段和

分析

動態規劃解法

這是一個經典的線性dp的模型。

狀態表示

$f(i) : $ 表示以a[i] 為結尾的最大子序列的和的值

狀態計算

對於當前位置 i 有兩種情況:

  • 加入當前子序列‘\(f(i) = f(i - 1) + a[i]\)
  • 不加入當前子序列\(f(i) = a[i]\)
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int len = nums.size();
        vector<int> dp(len + 1);
        dp[0] = nums[0];
        int ans = nums[0];
        for(int i = 1;i < len ;i ++)
        {
            dp[i] = max(dp[i-1] + nums[i] , nums[i]);
            ans = max(ans , dp[i]);
        }
        return ans;
    }
};
貪心解法

貪心問題首先定義貪心策略:

如果對於當前元素值前一段最大子序和 < 0 那麼我們就放棄前一段,否則則加上a[i]。

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