• 最大子段和


    题意:给出一段序列,选出其中连续且非空的一段使得这段和最大。

    O(N^2)做法:

    O(n)求出前缀和,O(N^2)枚举每个区间即可。

    代码就不给了。

    O(N)做法:

    每一个数字,它能够加入前面的区间,也能重新开始一个区间。所以我们以此为两种状态。

    状态转移方程:

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

    表示 包含i的区间的最大值,如果f[i-1]为负数,那么肯定要开辟一个新的区间,此区间暂时只有一个元素即a[i]。

     代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define ll long long int
    using namespace std;
    const int N=2005;
    ll n,a[N],f[N],ans=-0x3f3f3f3f;
    int main(){
        scanf("%lld",&n);
        for(ll i=1;i<=n;i++)
        scanf("%lld",&a[i]);
        for(ll i=1;i<=n;i++){
        f[i]=max(f[i-1]+a[i],a[i]);//加入前一区间 换新的区间
        ans=max(ans,f[i]);
        }
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    第二阶段个人冲刺总结01
    软件工程学习进度表13
    软件工程学习进度表12
    个人博客(09)
    个人博客(07)
    个人博客(08)
    poj1562 DFS入门
    poj3278 BFS入门
    数组单步运算
    十天冲刺
  • 原文地址:https://www.cnblogs.com/sky-zxz/p/9735453.html
Copyright © 2020-2023  润新知