多种方法求最大连续和

最大连续和的定义:给出一个长度为n的序列A1,A2,...,An,求最大连续和,即找要求找到1<=i<=j<=n,使得Ai+Ai+1+..+Aj最大。

方法一,根据定义容易想到:

int maxSubSeqSum(int A[],int N)
{
    int maxSum=A[0];
    int i,j,k;
    for(i=2;i<N;i++)
        for(j=i;j<N;j++)
        {
            int sum=0;
            for(k=i;k<=j;k++)
            {
                sum+=A[k];
            }
            if(sum>maxSum)
                maxSum=sum;
        }
       return maxSum;
}

方法二

int maxSubSeqSum(int A[],int N)
{
    int i,j;
    int maxSum=A[0];

    for(i=1;i<N;i++)
    {
        int sum=0;
        for(j=i;j<N;j++)
        {
            sum+=A[j];
            if(sum>maxSum)
                maxSum=sum;
        }
    }
    return maxSum;
}

方法三

int max(int a,int b)
{
    return a>b?a:b;
}

int maxSubSeqSum(int a[],int x,int y)
{
    if(y-x==1)
        return a[x];
    int m=x+(y-x)/2;
    int maxValue=max(maxSubSeqSum(a,x,m),maxSubSeqSum(a,m,y));
    /// a[x,m) a[m,y)
    int leftSum=0;
    int leftMaxValue=a[m-1];
    int i;
    for(i=m-1;i>=x;i--)
    {
        leftMaxValue=max(leftMaxValue,leftSum+=a[i]);
    }
    int rightSum=0;
    int rightMaxValue=a[m];
    for(i=m;i<y;i++)
    {
        rightMaxValue=max(rightMaxValue,rightSum+=a[i]);
    }
    return max(maxValue,leftMaxValue+rightMaxValue);
}

方法四

 int maxSubSeqSum( int A[], int N )
    {   int ThisSum, MaxSum;
        int i;
        ThisSum = MaxSum = 0;
        for( i = 0; i < N; i++ ) {
              ThisSum += A[i]; /* 向右累加 */
              if( ThisSum > MaxSum )
                      MaxSum = ThisSum; /* 发现更大和则更新当前结果 */
              else if( ThisSum < 0 ) /* 如果当前子列和为负 */
                      ThisSum = 0; /* 则不可能使后面的部分和增大,抛弃之 */
        }
        return MaxSum;
    }

方法一到方法四,算法的复杂度依次降低,方法一时间复杂度O(N^3),方法二时间复杂度O(N^2),方法三时间复杂度O(NlogN),方法四时间复杂度O(N)

时间: 2024-10-29 19:05:32

多种方法求最大连续和的相关文章

shell编程基础一(多种方法求值1+2+..+100)

#SHELL编程基础一(多种方法求值1+2+..+100)##为什么要学好shell shell脚本语言是实现linux系统管理及自动化运维所必备的重要工具,linux系统的底层及基础应用软件的核心大都涉及shell脚本的内容. 每一个合格的linux系统管理员或运维工程师,都需要能够熟练地编写shell脚本语言,并能够阅读系统及各类软件附带的shell脚本内容. 只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的工作,从而为个人的职场发展奠定较好的基础.# 本文的宗旨是熟

多种方法求最大公约数+求最小公倍数

本文将给出求两个数a和b的最大公约数的几种可行方法. 方法一:辗转相除法 算法分析:有两个数a和b,用辗转相除法. 不妨设a>b, 首先求a和b的余数,b赋值给a,余数赋值给b: 重复以上操作,直到余数为0: b值即为两数的最大公约数. 代码: 1 int zdgys(int a,int b) 2 { 3 int temp; 4 if( a<0 ) a=-a; 5 if( b<0 ) b=-b; 6 if( a<b ) { temp=a;a=b;b=temp; } // 让a>

多种方法求字符串长度

方法一: #include<stdio.h> #include<string.h> int main() { int count=0; char a[]="hello world !";     while(a[count]!='\0') { count++; } printf("%d\n",count); return 0; } 方法二: #include<stdio.h> int main() { int strlen=0;

多种方法求java求整数的位数

方法一 private static int getNumLenght(long num){ num = num>0?num:-num; return String.valueOf(num).length(); } 方法二 private static int getNumLenght(long num){ num = num>0?num:-num; if (num==0) { return 1; } return (int) Math.log10(num)+1; } 方法三 private

多种方法求最大值(委托方法,重载)

1 namespace ConsoleAppLearningCeshi 2 { 3 /// <summary> 4 /// 不同打招呼 5 /// </summary> 6 /// <param name="name"></param> 7 public delegate int deleMaxCompara<T>(T one, T two);//泛型委托 8 public delegate int deleMaxCompar

「C语言」「算法」多种方法求一个数的位数及逆序数

1 #include <stdio.h> 2 3 4 int main() 5 { 6 int a,b[5]={0,0,0,0,0},i=0,len=0; 7 scanf("%d",&a); 8 while(i<5) 9 { 10 b[i]=a%10; 11 a=a/10; 12 len++; 13 if(a==0) 14 break; 15 i++; 16 } 17 printf("%d\n",len); 18 for(i=len-1;i

C语言轻松高效学习方法之:多种方法实现

多种方法实现同一个功能,可以调动你学的所有知识去做,有助于你学的融会贯通. 下面举例来看: 实现功能:求一个整数的位数: 实现语言:C语言: 开发环境:Visual Studio 2017 如:3215是4位数 实现原理: 3215/10 = 321 ----1位数 321/10 = 32 ----又是1位数 32/10 = 3 ----又是1位数 3/10 = 0 ----又是1位数 共4位数,且终止计算条件是/10结果为0的时候: 根据这个原理,先写一个最笨的原始方法: 效果: 这种实现方案

从O(n^3) 到 O(n)求最大连续和

最大连续和问题:给出一个长度为n的序列A1, A2, A3,······ An,求最大连续和.或者这样理解:要求找到1≤i≤j≤n,使得Ai+ Ai+1 + ······ +Aj尽量大. [分析] 这时候最容易想到的就是暴力枚举了,,, 代码如下: 1 for(int i=1; i<=n; i++) { 2 for(int j=i; j<=n; j++) { 3 int sum = 0; 4 for(int k=i; k<=j; k++) 5 sum += val[k]; 6 //Max

HDU 1081 To the Max 最大子矩阵(动态规划求最大连续子序列和)

Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. I