对于序列nums,我们需要计算以每一个nums[i]结尾的子序列的最大和,最后取最大值得到整个序列的最大子序和。设以nums[i]结尾的最大序列和为dp[i],则dp[i]会在两种情况中进行挑选:
1. 以nums[i-1]结尾的最大序列和直接与nums[i]相加
2. 抛弃nums[i-1]结尾的最大序列和,只保留nums[i]
写成状态转移方程,也就是
边界条件为
这个转移方程中dp[i]只与dp[i-1]有关,也就是只与上一次的情况有关。这种情况我们可以进行一个空间复杂度的优化,只用一个变量dp来保存结果即可。
下面给出代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size() == 0) return NULL;
int dp &