题目描述
帅气的大白熊这天向小苯提出了一个问题,他给了小苯一个长度为 n 的数组 a。
他想知道,对于所有1<i<n 的下标i,都从数组中选择一段连续的区间[l,r], 使得l<i<r,即选择一个包含i的区间的话,这段区间和最大是几?
请聪明的你帮帮小苯解答吧。
输入描述:
输入包含两行。
第一行一个正整数 n(1≤n≤2×10^5)
第二行 n个整数 ai(−10^9≤ai≤10^9),a表示这个数组。
输出描述
输出包含一行 n 个整数。
其中第 i个整数代表,选择一段包含 ai的区间,这段区间的最大和。
示例
输入
4 1 -2 3 -4
输出
2 2 3 -1
说明
i=1 ,选择 [1,3],结果是: 1+(−2)+3=2是最优解。
i=2,选择 [1,3]
i=3,选择 [3,3]
i=4 ,选择 [3,4]
对于这一道题的核心思想就是对于第i项的a(为了迎合题目方便理解,让i从1开始),我们只需要找到前i-1项最大连续子列的和(含i-1),以及后i+1项连续子列的最大和(含i+1项),这样只要用第i项的值加前i-1项最大的和加后i+1项最大的和就是要找的结果了。以下说的连续子列都包含边界
具体实现:这里只用看前i-1项的如何实现就可以了,后i+1项非常相似。先不考虑首和尾的元素,先看中间随便取个,比如说这个用例中,我们取i=3,也就是数值3,我们要找前两项和的连续子列的最大值(含第二项),那么我们可以将这个问题继续往下分,找前两项连续的最大和,不就是找前一项的连续的最大和吗(含第一项),这个问题不就从第i-1项找化作了从第1项开始找,如果第一项是小于零的,那就可以跳过他,如果是大于零的,就可以++,比如说第一项,值为1,记入,然后到第二项,1-2=-1小于零,置为零,跳过,这样就到了第三项,此时我们已经找到了i=3时的前i-1项(含i-1)的连续子列的最大和,零,零的意思就是不需要前面的区间。