题目描述
帅气的大白熊这天向小苯提出了一个问题,他给了小苯一个长度为 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ÿ