最大子区间和(前缀和)

题目来源于洛谷: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!

posted @ 2026-10-08 22:23  yi_one  阅读(2)  评论(0)    收藏  举报