思路:把dp数组处理好,遍历dp数组求最大值。最大值就是最大的子序和。
第一步:搞清楚dp数组以及下标的含义
新的dp数组的长度是原数组的长度,第一个元素是原数组的第一个元素。
那么这个dp[i]当中的i是什么意思呢?我们假设i等于1,就知道第一次的判断是dp数组的第一个元素(也就是原数组的第一个元素)和原数组的第二个元素相加。也就是说原数组的第一个数和第二个数加起来有没有比单独的第二个数大。如果有的话,dp数组的第二个数就把这个加和存进dp数组的第二个数。从而不难发现,dp数组里面的任意一个元素dp[i],都是以i结尾原数组的连续子数组的最大和。这里特别要注意必须是以i结尾的原数组,而且还是连续的。
这个i是指原数组的下标,也就是第i+1个元素。
第二步:递推公式
两种情况:情况一:
dp[i-1]和array[i]的和比array[i](i从1开始)的大:
dp[i]=do[i-1]+array[i]
情况二:
dp[i-1]和array[i]的和比array[i](i从1开始)的小:
dp[i]=array[i]
第三步:dp数组如何初始化
dp数组的第一个元素必须是原数组的第一个元素,然后根据递推公式赋值其余元素
第四步:遍历顺序
从前往后。符合思考的习惯。