zoukankan      html  css  js  c++  java
  • 最大子序列求和问题

    问题: 
    给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大 

    例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21。

    //方案1,穷举法,三层循环求出每种可能的组合的和,O(n3)
    int MaxSum1(int array[],int length)
    {
    	int maxval=array[0];
    	int tmp;
    	for(int i=0;i<length;i++)
    	{
    		
    		for(int j=i;j<length;j++)
    		{
    			tmp=0;
    			for(int k=i;k<=j;k++)
    				tmp+=array[k];
    			if(tmp>maxval)
    				maxval=tmp;
    		}
    	}
    	return maxval;
    }
    //方案2,减少一层循环,还是求出每一种可能组合的和,O(n2)
    int MaxSum2(int array[],int length)
    {
    	int maxval=array[0];
    	int tmp;
    	for(int i=0;i<length;i++)
    	{
    		tmp=0;
    		for(int j=i;j<length;j++)
    		{
    			tmp+=array[j];//可以保存temp的值,因为实际上Sum(i, j+1) = Sum(i, j) + array[j+1]
    			if(tmp>maxval)
    				maxval=tmp;
    		}
    	}
    	return maxval;
    }
    //方案3,线性方案,原理:任何一个和小于零的子序列不可能是最长子序列的一部分,O(n)
    int MaxSum3(int array[],int length)
    {
    	int maxval=array[0];
    	int tmp=maxval;
    	for(int i=1;i<length;i++)
    	{
    		tmp+=array[i];
    		if(tmp>maxval)
    			maxval=tmp;//保存当前和最大的子序列的和
    		else if(tmp<0) //只要子序列的和不小于0,那么它就有可能是和最大的子序列的一部分
    			tmp=0; //当子序列和出现小于零,那么这部分一定不可能是最大子序列,我们需要重新计算子序列
    	}
    	return maxval;
    }


  • 相关阅读:
    设计模式之解释器模式
    设计模式之中介者模式
    设计模式之职责链模式
    设计模式之命令模式
    设计模式之迭代器模式
    设计模式之备忘录模式
    设计模式之状态模式
    【转】CSS中position属性( absolute | relative | static | fixed )详解
    【转】fiddler-http协议调试代理工具
    TCP/IP、Http、Socket的区别
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3155297.html
Copyright © 2011-2022 走看看