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

    问题描述:求-2,11,-4,13,-5,-2 的最大子序列和。

    方法一:使用3层for循环嵌套,穷举式的尝试所有的可能,代码如下:

    public class Demo1 {
    
    	public int maxSum(int a[]){
    		int maxSum=0;
    		for(int i=0;i<a.length;i++){
    			for(int j=i;j<a.length;j++){
    				int sum=0;
    				for(int k=i;k<=j;k++){
    					sum+=a[k];
    					if(sum>maxSum){
    						maxSum=sum;
    					}
    				}
    			}
    		}
    		return maxSum;
    		
    	}
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
            Demo1 d=new Demo1();
            int a[]={-2,11,-4,13,-5,-2};
            System.out.println("最大子序列和为"+d.maxSum(a));
    	}
    
    }
    


     

    方法二:使用两个for循环嵌套:

    public class Demo2 {
    
    	public int maxSum(int a[]){
    		int maxSum=0;
    		for(int i=0;i<a.length;i++){
    			int sum=0;
    			for(int j=i;j<a.length;j++){
    				
    				sum+=a[j];
    				if(sum>maxSum){
    					maxSum=sum;
    				}
    			}
    		}
    		return maxSum;
    	}
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Demo2 d=new Demo2();
            int a[]={-2,11,-4,13,-5,-2};
            System.out.println("最大子序列和为"+d.maxSum(a));
    	}
    
    }
    


    方法三:使用分治策略,即把问题分成大致相等的子问题,然后递归对他们求解,然后得出最后的解。

    public class Demo3 {
        public int maxSum(int a[],int left,int right){
        	if(left==right){                    //判断序列中元素是否只有一个
        		if(a[left]>0){
        			return a[left];
        		}
        		else 
        			return 0;
        	}
          	int center=(left+right)/2;            //求整个序列的中间值
        	int maxLeftSum=maxSum(a,left,center);   //运用递归求左边的子序列的最大值
        	int maxRightSum=maxSum(a,center+1,right);   // 运用递归求右边的子序列的最大值
        	
        	int leftSum=0;
        	int maxLeft=0;
        	for(int i=center;i>=left;i--){       //求左边的最大子序列和
        		leftSum+=a[i];
        		if(leftSum>maxLeft){
        			maxLeft=leftSum;
        		}
        	}
        	
        	int rightSum=0;
        	int maxRight=0;
        	for(int i=center+1;i<=right;i++){    //求右边的最大子序列和
        		rightSum+=a[i];
        		if(rightSum>maxRight){
        			maxRight=rightSum;
        		}
        	}
        	
        	return max(maxLeftSum,maxRightSum,maxLeft+maxRight);
        	
        }
        public int max(int a,int b,int c){   //求三个数中的最大值
        	int maxNum;
        	if(a>=b){
        		if(a>=c){
        			maxNum=a;
        		}
        		else 
        			maxNum=c;
        	}
        	else 
        		if(b>=c){
        			maxNum=b;
        		}
        		else 
        			maxNum=c;
        	return maxNum;
        	
        }
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
              Demo3 d=new Demo3();
              int a[]={-2,11,-4,13,-5,-2};
              System.out.println("最大子序列和为:"+d.maxSum(a,0,a.length-1));
    	}
    
    }
    



     

  • 相关阅读:
    vim编辑器
    linux常用的命令解释
    克隆虚拟机及本地仓库的搭建
    创建windows系统下的虚拟机
    创建linux系统下的虚拟机
    drf频率组件
    django中过滤 搜索 排序
    drf分页
    js回顾
    数据类型
  • 原文地址:https://www.cnblogs.com/oversea201405/p/3752285.html
Copyright © 2011-2022 走看看