求数组的最大和子数组
作者:
無題
,
2020-08-28 09:30:25
,
所有人可见
,
阅读 524
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
int main()
{
int n;
cin >> n;
int a[n];
for(int i=0; i<n; i++) cin >> a[i];
vector<PII> f(n+1, {0,0}); //first存最大和,second存子数组前缀
f[0] = {0, -1};
for(int i=1; i<n; i++){
if(a[i-1] + f[i-1].first >= a[i-1]){
f[i].first = a[i-1] + f[i-1].first;
f[i].second = f[i-1].second;
}
else{
f[i] = {a[i-1], i-1};
}
}
int max_v = INT_MIN;
PII ret = {0, 0}; //ret用来根据最大值更新子数组的后缀
for(int i=0; i<=n; i++){
if(f[i].first > max_v){
max_v = f[i].first;
ret = {f[i].second, i-1};
}
}
for(int k=ret.first; k<=ret.second; k++){
cout << a[k] << " ";
}
return 0;
}
输入:
9
-2 1 -3 4 -1 2 1 -5 4
输出:
4 -1 2 1