dp数组定义:
dp[i] 表示以下标为i结尾的连续子串的最大和
那么,我们要求的答案便是所有以i结尾的字串的最大和中,最大的那一个。
状态转移:
dp[i] = max(dp[i-1]+num[i],num[i])
解释:若dp[i-1]<0,那么对dp[i]产生了负面影响,我们不要前面的dp[i-1],只需要当前的num[i]。
对应的就是max(dp[i-1]+num[i],num[i]), 即取(dp[i-1]+num[i],num[i])中较大的那一个。
初始情况:
dp[0] = num[0]
这比较好理解,即取下标为0的元素。
代码如下:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n,0);
//定义 dp[i] 为以 下标为i 结尾的子串的最大值
dp[0] = nums[0];
for(int i=1;i<n;i++)
{
dp[i] = max(dp[i-1]+nums[i],nums[i]);
}
return *max_element(dp.begin(),dp.end()); //求出所有i结尾的字串的最大值
}
};