原代码
sum+=x;
if (sum<x) sum=x;
首先我们发现一个性质:sum开头一定是正数。
因为如果是负数,遇到正数之后绝对不如单单留下正数更优。
所以sum开头一定是正数。
我们再来思考什么时候 sum<x
只有 sum<0 的时候,加任意数都小于她本身。
代码里面是直接舍去sum,现在来证明为什么这样做?
我们可能会想到,可以不用完全舍去,去掉左边几个值不就行了吗。
现在我们来试一下,我们的目的是为了让 sum去除几个位置使其 >0
那么我们先去掉几个,因为开头就是正数,那么只去除正数,sum只会更小,所以还得有负数,并且只有负数的和大于正数的和,sum才变大。
假设我们已经找到了一个含有正负数的去除区间,可以使sum>0,但是我们发现,这个去除区间也小于0,这也就意味,当sum等于这个区间的时候,是小于零的,那么再加上下一个数的时候,肯定不如本身更优。
然而现在的sum之中既有之前去除区间的 sum,还加上了当前的数。二者相互矛盾,因此无法找到一个区间使得 sum>0,因此直接舍去是最优的。