zoukankan      html  css  js  c++  java
  • 最大连续和

    首先用枚举:

     1 #include<iostream>
     2 using namespace std;
     3 int n,a[11000];
     4 int main()
     5 {
     6     cin>>n;
     7     for(int i=1;i<=n;i++)
     8     {
     9         cin>>a[i];
    10     }
    11     int maxn=0,sum=0;
    12     for(int i=1;i<=n;i++)
    13     {
    14         for(int j=1;j<=n;j++)
    15         {
    16             sum=0;
    17             for(int k=i;k<=j;k++)
    18             {
    19                 sum+=a[k];
    20             }
    21             maxn=max(maxn,sum);
    22         }
    23     }
    24     cout<<maxn;
    25 }

    这应该是每个人不看N范围的第一反应......(大佬除外),但看到N<=200000......我们发现n³妥妥的爆,我想的方法是前缀和书上的方法也是,时间复杂度是O(N²):

     1 #include<iostream>
     2 using namespace std;
     3 long long n,a[210000];
     4 long long ans[210000];
     5 int main()
     6 {
     7     cin>>n;
     8     for(long long i=1;i<=n;i++)
     9     {
    10         cin>>a[i];
    11     }
    12     for(long long i=1;i<=n;i++) ans[i]=ans[i-1]+a[i];
    13     long long maxn=-2000001,sum=0;
    14     for(long long i=1;i<=n;i++)
    15     {
    16         for(long long j=i;j<=n;j++)
    17         {
    18             maxn=max(maxn,ans[j]-ans[i-1]);
    19         }
    20     }
    21     cout<<maxn;
    22 }

    发现还是会TLE.....,于是书上用二分去算.....是nlog(n)的时间复杂度.....但我用的是O(n)的复杂度:

    #include<bits/stdc++.h>
    using namespace std;
    int x;
    int n;
    int sum=0;
    int maxn=-2147483647;
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            sum=max(sum+x,x);//用DP的思想,选,不选
            maxn=max(maxn,sum);
        }
        printf("%d",maxn);
        return 0;
    }
  • 相关阅读:
    远程线程注入与CreateRemoteThread
    游戏修改器编写原理
    软件保护技术常见保护技巧
    反跟踪技术
    C++用static声明的函数和变量小结
    PE文件格式分析及修改
    MMX指令集在C++中的使用
    HOOKAPI之修改IAT法则
    如何获取 程序加载后的内存起始地址
    Java线程中断的本质和编程原则
  • 原文地址:https://www.cnblogs.com/dai-jia-ye/p/9518456.html
Copyright © 2011-2022 走看看