動態規劃--求解最大子數組和

目錄

問題:

應用場景:

分析:

C++實現 

特殊情況


問題:

給定一個整數數組arr, 求所有的子數組中 和最大的 子數組 。返回最大子數組和。

應用場景:

在金融中可以通過求一隻股票的價格區間中的最大子數組和來找到 價格波動最大的區間範圍,以便進一步分析。

分析:

1)解法方法一: 通過枚舉出該數組所有的子數組,在找到子數組和最大的即可。

2)動態規劃求解:


//Implement the MaxSubArr with dynamic programming.
/* Input: arr = [1,-3,4,5,6,-8,9,-30,18]
          n = arr.szie();
          i = 0...n-1

1)構造動態方程    
該問題的狀態方程:dp[i]表示以元素arr[i]結尾時,的最大子數組和。      
         arr[0]           if n>1 or n=1
dp[i] =  dp[i-1] + arr[i]  if dp[i-1] >0 and n>1
         arr[i]            if dp[i-1] < 0 and n>1 

dp = [1,-2,4,9,15,7,16,-14,18]

2)遍歷dp,即可得到最大子數組和。
*/

C++實現 

#include <iostream>
#include <vector>
using namespace std;


class Solution{
public:
    int MaxSubArr(vector<int>& arr){
        vector<int> dp;
        int n = arr.size();
        int max_sum = 0;
        if ((n > 1) || (n==1)){
            dp.push_back(arr[0]);
        }
        for(int i=1; i<n; i++){
            dp.push_back(dp[i-1]>0 ? (dp[i-1]+arr[i]) : arr[i]);
        }
        for(int i=0; i<dp.size(); i++){
            if (dp[i] >max_sum){
                max_sum = dp[i];
            }
        }
        return max_sum;
    }
};
int main(){
    vector<int> arr;
    arr.push_back(1);
    arr.push_back(-3);
    arr.push_back(4);
    arr.push_back(5);
    arr.push_back(6);
    arr.push_back(-8);
    arr.push_back(9);
    arr.push_back(-30);
    arr.push_back(18);
    Solution s;
    cout << "MaxSum of SubArr : " << s.MaxSubArr(arr) << endl;
    return 0;
}

特殊情況

   當給定數組arr中都是負數時,該算法不適用。

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