最大子序和
题目链接:最大子序和
假设 \(nums\) 的数组长度是 \(n\),下标从 \(0\) 到 \(1\)。
我们用 \(a_{i}\) 代表 \(nums[i]\) ,用 \(dp[i]\)代表以第\(i\)个数结尾的【连续子数组的最大和】,那么很显然我们要求的答案就是:
\(max{dp[i]} 0 \leq i \leq n-1\)
因此我们只需要求出每个位置的\(dp[i]\),然后返回\(dp\)数组中的最大值即可。那么我们如何求解\(dp[]\)呢?我们可以考虑\(a_{i}\)单独成为一段
还是加入\(dp[i-1]\)对应的那一段,这取决于\(a_{i}\)和\(dp[i-1] + a_{i}\)的大小,我们希望获得一个比较大的,于是可以写出这样的动态规划
转移方程:
dp[i] = max{dp[i-1] + \(a_{i},a_{i}\)}
AC代码如下
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int len = nums.size();
if(len == 0){
return 0;
}else if(len == 1){
return nums[0];
}
vector<int> dp(len);
dp[0] = nums[0];
for(int i=1;i<len;i++){
dp[i] = max(dp[i-1] + nums[i],nums[i]);
}
int maxNum = dp[0];
for(int i=0;i<len;i++){
if(dp[i] > maxNum){
maxNum = dp[i];
}
}
return maxNum;
}
};