DP--最大子段和

    科技2022-07-11  98

    DP–最大子段和

    题目描述 给出一个长度为 nn 的序列 aa,选出其中连续且非空的一段使得这段和最大。

    输入格式 第一行是一个整数,表示序列的长度 n。

    第二行有 n 个整数,第 i 个整数表示序列的第 i 个数字 ai .

    输出格式 输出一行一个整数表示答案。

    输入输出样例 输入 7 2 -4 3 -1 2 -4 3 输出 4

    算法思路 通过题意,我们可以了解到:

    f[i]=max(f[i-1]+n[i],n[i])

    但是!

    f[n]的值并不一定是最终结果

    比如这个输入:

    5 233 233 -666 1 1

    如果直接输出f[n]的值,结果会是2,但是答案应该为466!

    为什么?

    因为若f[i]的值为负数,则f[i+1]的值就是n[i],而n[i]的值不一定比前面的最大字段和数大!

    (或者n[i]为负数,则f[i]小于f[i-1]!)

    所以,我们还要再用一个数从1到n再查找一次,才能找出最大数!!!

    #include<bits/stdc++.h> using namespace std; const int N = 2e5 + 5; int a[N]; int main() { int n,ans = -N,x; cin >> n; for(int i = 1;i <= n;i++) { cin >> x; if(i < 2) a[i] = x; else { a[i] = max(a[i - 1] + x,x); ans = max(a[i],ans); } } cout << ans << endl; return 0; }
    Processed: 0.016, SQL: 8