# 最大子数组和——动态规划、分治

> 发布于：2022-02-28 | 分类：刷题 | 原文：https://www.imbailey.cn/post/maximum-subarray-sum-dp-divide-conquer

## 题目

> 来自：https://leetcode-cn.com/problems/maximum-subarray/

#### [53. 最大子数组和](https://leetcode-cn.com/problems/maximum-subarray/)

难度简单4424收藏分享切换为英文接收动态反馈

给你一个整数数组 `nums` ，请你找出一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。

**子数组** 是数组中的一个连续部分。

 

**示例 1：**

```
输入：nums = [-2,1,-3,4,-1,2,1,-5,4]
输出：6
解释：连续子数组 [4,-1,2,1] 的和最大，为 6 。
```

**示例 2：**

```
输入：nums = [1]
输出：1
```

**示例 3：**

```
输入：nums = [5,4,-1,7,8]
输出：23
```



## 题解

**法一：动态规划**

用一个数组f[i]表示以第i个元素结尾的具有最大和的连续子数组，i从0开始。有如下式子：

```
f[i] = max( f[i-1]+nums[i] , nums[i] )
```

这样就可以递推求出所有的f[i]啦。代码如下：

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

我这里写的很简陋，力扣官方给的题解说的很清楚：https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-by-leetcode-solution/

**法二：分治**

因为用法一把这题过了，懒得看法二了...
