给你一个数组,找一段连续的子序列,使他得和是所有连续子序列最大的
7
2 -4 3 -1 2 -4 3
可以发现选 3 -1 2 是一种合法的方案。那么是怎么推出来的呢?
第一个数为一个有效序列
如果一个数加上上一个有效序列得到的结果比这个数大,那么该数也属于这个有效序列。
如果一个数加上上一个有效序列得到的结果比这个数小,那么这个数单独成为一个新的有效序列
在执行上述处理的过程中实时更新当前有效序列的所有元素之和并取最大值。
然后就可能有人问了:考虑上面样例推导中,出现了一个可加可不加的 3如何处理?
结论是:对于可加可不加的数,不如加上。因为加上对答案没有坏处,而如果这个数后面还有一部分能让答案变多,因为本题求的子段是连续子段,不加上的话这两边就连不起来了。所以无脑加就行了。
const int N = 100010,M=200010;
//int a[N];
void solve()
{
int n;
cin >> n;
int ans = -1e9;
int b;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
if (i == 1) b = x;
else b = max(x, b + x);
ans = max(ans, b);
}
cout << ans << '\n';
}