最大子区间和(前缀和)
题目来源于洛谷:https://www.luogu.com.cn/problem/P3009
瞄一眼tag...诶,是分治...小小蒟蒻对于分治理解实在不到位...
凭借之前做题的灵感💡,很容易想到了可以求前缀和,找到最大的前缀和,然后找在它之前的最小的前缀和,二者相减就是答案ans
(这里很容易证明不存在最大前缀和后面的某个数-前面的某个数会比ans大)
代码如下:直接输入数即可,可以不用数组存储
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
#define fi first
#define se second
const ll N=5005,mod=92084931,INF=1e18;
void solve(){
ll n;
cin>>n;
ll s=0,minv=0,ans=-INF;
for(ll i=0;i<n;i++){
ll x;
cin>>x;
s+=x;
if(s-minv>ans){
ans=s-minv;
}
if(s<minv){
minv=s;
}
}
cout<<ans;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll T = 1;
//cin >> T;
while (T--)
solve();
return 0;
}
bye~everybody!

浙公网安备 33010602011771号