最大子列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;
 }

posted @ 2017-03-22 12:33  jacksin  阅读(164)  评论(0编辑  收藏  举报