用递归得到最大子列并且标记最大子列的第一个和最后一个的数字
代码如下:
#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;
}