最大字段和
算法步骤
1、用 cur 维护当前和 (初始化为0),用 res 保存最终结果 (初始化为 -inf),用 temp 维护开始的位置
2、遍历 a 数组,cur+=a[i] ,如果 cur < 0,则 cur=0 ,temp=i+1从新开始
3、如果 cur>res,更新res=cur,l=temp,r=i
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<algorithm> using namespace std; const int maxn = 100010; const int inf = 0x7fffffff; int n,l,r; int a[maxn]; long long maxSum(){ long long cur = 0,res=-inf; int temp = 1; for (int i = 1; i <= n; i++){ cur += 1ll*a[i]; if (cur > res){ res = cur; l = temp; r = i; } if (cur < 0){ cur = 0; temp = i + 1; } } return res; } int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; cout << maxSum()<<" "; cout<< l <<" "<< r << endl; return 0; }