最大子列2

用递归得到最大子列并且标记最大子列的第一个和最后一个的数字

代码如下:
#include<stdio.h>
 /*
	Name: maximum subsequence 2
	Copyright: 
	Author: demosees
	Date: 22/03/17 12:27
	Description: find the largest sum, together with the first and the last numbers of the maximum subsequence
*/

 int Max3(int A,int B,int C)
 {
 	return A>B?A>C?A:C:B>C?B:C; 
 }
 int DivideAndConquer(int List[],int left,int right)
 {
 	int MaxLeft,MaxRight;
 	int MaxLeftSum,MaxRightSum;
 	int LeftSum,RightSum;
 	int center,i;
 	  
 	if(left==right)
 	   if(List[left]>0) return List[left];
 	     else return 0;
 	    
		 center=(left+right)/2; 
 	     
   MaxLeft=DivideAndConquer(List,left,center);
   MaxRight=DivideAndConquer(List,center+1,right);
   
   MaxLeftSum=0;LeftSum=0; 
   for(i=center;i>=left;i--){
   
      LeftSum=LeftSum+List[i];
       if(LeftSum>MaxLeftSum)    
            MaxLeftSum=LeftSum;
     }       
   
   MaxRightSum=0;RightSum=0;
   for(i=center+1;i<=right;i++){
   
      RightSum=RightSum+List[i];
       if(RightSum>MaxRightSum)  
            MaxRightSum=RightSum;
     }    
	 return Max3(MaxLeft,MaxRight,MaxLeftSum+MaxRightSum);
	         
}

int MaxSubseqSum3(int List[],int N) 
{
	return DivideAndConquer(List,0,N-1);
}

    int main()
 {
 	 int subsque[10000],n,j,k,max,sum,flag=1;
 	 scanf("%d ",&n);
 	 for(j=0;j<n;j++)
 	    scanf("%d",&subsque[j]);
 	    
 	    max=MaxSubseqSum3(subsque,n);
 	if(max==0)    
 	    printf("%d %d %d",0,subsque[0],subsque[n-1]);
 	 else   
	  for(k=0;k<n&&flag;k++){
 	      sum=0;
 	    
		  for(j=k;j<n&&flag;j++){
		  
		       sum=sum+subsque[j];
			   if(sum==max)
			   {
			    printf("%d %d %d",sum,subsque[k],subsque[j]);
			    flag=0;
				 }
 	        }
 	    }	    
 	    
     	return 0;
 }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值