logo AlgoBeat OnlineJudge
登录 注册

「最大子段和」题解

作者: Dr_KC_Haus  ·  发布于 2026-07-10 14:49:19  ·  最后修改于 2026-07-10 15:04:08
已通过
审核员:Lemon_zqp 弱弱 · 2026-07-10 15:04:08

洛谷观看效果更佳


首先看一眼标签。能不能暴力?好像不行,如果数据大于 时可能会超时,那就只能打正解了。

最大子段和问题,首先要遍历数组。

在遍历时,如果前面的子段和是负数那么重新开始‌一个新的子段(只包含 ),否则延续‌之前的子段。(将 加入到之前的子段中)

为什么如果前面的子段和是负数要重新开始‌一个新的子段? 因为如果继续累加会导致答案错误,不如从当前位置重新开始。

那么可以推出动态转移方程:

那么这道题就完成了。

AC Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
constexpr int N=1e7+7;//冷知识:如果数组长度是奇数那么会更快一点 
int a[N];
int n;
signed main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    //初始化
    int maxn=a[0];//最大子段和
    int ans=a[0];//当前子段和
    for(int i=1;i<n;i++) {
        //比较当前子段和和当前元素,看看是否需要重新开始
        ans=max(a[i],ans+a[i]);
        //更新最大子段和
        maxn=max(maxn,ans);
    }
    cout<<maxn;
    exit(0);
}

暂无评论

登录 后即可评论。