最大連續子段和問題(動態規劃/貪心)
阿新 • • 發佈:2020-09-08
最大連續子段和問題
問題描述
給定一個數組,記錄一串數字,且元素值即存在正數也存在負數,現在要你求出陣列中最大的連續子段和
分析
動態規劃解法
這是一個經典的線性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; } };