动态规划--求解最大子数组和

目录

问题:

应用场景:

分析:

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 
#include 
using namespace std;


class Solution{
public:
    int MaxSubArr(vector& arr){
        vector dp;
        int n = arr.size();
        int max_sum = 0;
        if ((n > 1) || (n==1)){
            dp.push_back(arr[0]);
        }
        for(int i=1; i0 ? (dp[i-1]+arr[i]) : arr[i]);
        }
        for(int i=0; imax_sum){
                max_sum = dp[i];
            }
        }
        return max_sum;
    }
};
int main(){
    vector 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中都是负数时,该算法不适用。

你可能感兴趣的:(C++)