求连续子数组的最大和问题
代码不重要!重要的是思想过程(括弧 好难啊!!!)
输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},输出连续子数组的最大和是18。
步骤 | 操作 | 累加的子数组和 | 最大的子数组和 |
---|---|---|---|
1 | +1 | 1 | 1 |
2 | -2 | -1 | 1 |
3 | 抛弃前面的(+1 - 2 ) ,加3 | 3 | 3 |
4 | +10 | 13 | 13 |
5 | -4 | 9 | 13 |
6 | +7 | 16 | 16 |
7 | +2 | 18 | 18 |
8 | -5 | 13 | 18 |
动态规划:
- f(i)表示第i个数字结尾的子数组的最大和
- 求max[f(i)]
- 当第 i-1 个数字结尾的子数组中所有数字的和小于0时,如果把这个数再和下一个数字相加,那么求出的和,反而比下一个数字本身还小了,所以就从第i个数字作为起点开始计算
- 如果第i-1个数字和下一个数字和大于0,那么就相加。
递归公式:
f(i)={pData,i=0或者f(i−1)≤0f(i−1)+pData[i],i!=0并且f(i−1)>0f(i)=\begin{cases} pData, i = 0 或者f(i-1)\leq 0\\ f(i-1) + pData[i], i != 0 并且 f(i-1)>0 \end{cases} f(i)={pData, i=0或者f(i−1)≤0f(i−1)+pData[i], i!=0并且f(i−1)>0