最大子序列和问题

问题描述:求-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));
	}

}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光光-Leo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值