最大子列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; }
生命之树常青葱,而理论总朦胧!