最大子段和

https://www.luogu.com.cn/problem/P1115

b[i]为以a[i]为结尾的子段中的最大子段和

  1. 非空子段: b[i]=max(a[i],b[i-1]+a[i]);

  2. 可以为空的子段: b[i]=max(0,a[i],b[i-1]+a[i]);

    因为b[i-1]>=0,所以b[i-1]+a[i]>=a[i]

    即: b[i]=max(0,b[i-1]+a[i]);

#include<bits/stdc++.h>
using namespace std;
int a[1000000],b[1000000];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	for(int i=1;i<=n;i++) b[i]=max(a[i],b[i-1]+a[i]);
	int maxn=b[1];
	for(int i=1;i<=n;i++) maxn=max(maxn,b[i]);
	cout<<maxn;
	return 0;
}```
原文地址:https://www.cnblogs.com/qwq-/p/13544695.html