zoukankan      html  css  js  c++  java
  • 求数组最大的连续和

    如果求连续的乘积和就要考虑负数相乘和0的情况……!

    连续乘积子序列最大

    mi[1] = mx[1] = a[1];
            for(int i = 2;i <= n;i++){
                mi[i] = min(min(a[i],a[i]*mi[i-1]),a[i]*mx[i-1]);
                mx[i] = max(max(a[i],a[i] * mi[i-1]),a[i] * mx[i-1]);
            }
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <cstdlib>
    #include <stack>
    #include <cctype>
    #include <string>
    #include <malloc.h>
    #include <queue>
    #include <map>
    
    using namespace std;
    
    const int INF = 0xffffff;
    const double esp = 10e-8;
    const double Pi = 4 * atan(1.0);
    const int Maxn = 2000+10;
    const long long mod =  2147483647;
    const int dr[] = {1,0,-1,0,-1,1,-1,1};
    const int dc[] = {0,1,0,-1,1,-1,-1,1};
    typedef long long LL;
    
    LL gac(LL a,LL b){
        return b?gac(b,a%b):a;
    }
    
    int a[10000];
    
    int maxsum(int x,int y){ ///算法复杂nln(n),f(n) = 2 * f(n/2)+n,f(1) = 1;
        if(y-x == 1)
            return a[x];
        int m = x + (y-x)/2;
        int mm = max(maxsum(x,m),maxsum(m,y));
        int L = a[m-1];
        int R = a[y-1];
        int v = 0;
        for(int i = m-1;i > -1;i--){
            v += a[i];
            L = max(v,L);
        }
        v = 0;
        for(int i = m;i < y;i++){
            v += a[i];
            R = max(R,v);
        }
        return max(mm,L+R);
    }
    
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("inpt.txt","r",stdin);
    #endif
        int n;
        while(~scanf("%d",&n)){
            int s[10000];
            memset(s,0,sizeof(s));
            int mx = -0xfffff;
            int tt = -1;
            for(int i = 1;i <= n;i++){
                scanf("%d",&a[i]);
                s[i] += (s[i-1] + a[i]);
                if(s[i] >= mx){
                    mx = s[i];
                    tt = i;
                }
            }
            int mi = a[1];
            if(tt != -1){
                for(int i = 2;i < tt;i++){  ///在已经找到的最大和的前面寻找最小值
                    mi = min(mi,[i]);
                }
            }
            cout << "D1:" << mx - mi << endl;
            int xx = maxsum(1,n+1);
            cout << "D2:"<< xx << endl;
        }
        return 0;
    }
    连续子序列最大和
  • 相关阅读:
    Hbase­优化方案
    ssh 登录
    微软2017校招笔试题3 registration day
    微软2017校招笔试题2 composition
    STL中的查找算法
    leetcode-188 买卖股票4
    leetcode-306 Additive Number
    网络安全(3): 数据完整性校验
    网络安全(2)-数据加解密
    linux共享库
  • 原文地址:https://www.cnblogs.com/hanbinggan/p/4298554.html
Copyright © 2011-2022 走看看