最大子列和问题
//O(N^3) int MaxSubseqSum1(int A[],int N){ int ThisSum,MaxSum = 0; int i,j,k; for(i=0;i<N;i++){ for(j=i;j<N;j++) ThisSum = 0; for(k=i;k<=j;k++) ThisSum += A[k]; if(ThisSum > MaxSum){ MaxSum = ThisSum; } } return MaxSum; } //O(N^2) int MaxSubseqSum2(int A[],int N){ int ThisSum,MaxSum = 0; int i,j,k; for(i=0;i<N;i++){ ThisSum = 0; for(j=i;j<N;j++) ThisSum += A[j]; if(ThisSum > MaxSum){ MaxSum = ThisSum; } } return MaxSum; } //O(N*logN)——分治 //O(N)——在线处理 int MaxSubseqSum4(int A[],int N){ int ThisSum,MaxSum; int i; ThisSum = MaxSum = 0; for(i = 0;i<N;i++){ ThisSum += A[i]; if(ThisSum>MaxSum) MaxSum = ThisSum; else if(ThisSum<0) ThisSum = 0; } return MaxSum; }
练习题:
#include <stdio.h> #define MAXN 100000 void MaxSubseqSum(int A[],int N); int main(){ int List[MAXN],N,i; scanf("%d",&N); for (i=0;i<N;i++) scanf("%d",&List[i]); MaxSubseqSum(List,N); return 0; } void MaxSubseqSum(int A[],int N){ int ThisSum,MaxSum; int i,start,end,temp; ThisSum = MaxSum = 0; start = end = temp = 0; for(i = 0;i < N;i++){ ThisSum += A[i]; if(ThisSum > MaxSum){ start = temp; end = i; MaxSum = ThisSum; } else if(ThisSum < 0){ temp = i+1; ThisSum = 0; } } if(MaxSum==0) end = N-1; printf("%d %d %d",MaxSum,A[start],A[end]); }
试点5:负数和0未通过
其他测点通过
#include <stdio.h> #define MAXN 100000 void MaxSubseqSum(int A[],int N); int main(){ int List[MAXN],N,i; scanf("%d",&N); for (i=0;i<N;i++) scanf("%d",&List[i]); MaxSubseqSum(List,N); return 0; } void MaxSubseqSum(int A[],int N){ int ThisSum,MaxSum; int i,start,end,temp,flag; ThisSum = MaxSum = 0; start = end = temp = flag = 0; for(i = 0;i < N;i++){ ThisSum += A[i]; if(A[i]>=0) flag = 1; if(ThisSum > MaxSum){ start = temp; end = i; MaxSum = ThisSum; } else if(ThisSum < 0){ temp = i+1; ThisSum = 0; } } if(MaxSum==0){ if(flag == 0){ printf("0 %d %d",A[0],A[N-1]); } else{ printf("0 0 0"); } } else{ printf("%d %d %d",MaxSum,A[start],A[end]); } }
全部测点通过
这里有个坑,如果全为负数,输出第一个和最后一个元素,如果中间有个0,就要都输出0
还有一个坑就是要输出元素而不是元素下标,题目给的例子元素和下标正好相等,估计会坑不少人