C语言小苯的区间和疑惑

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值