//法1:每次都扫描整个序列
#include <cstdio>
int MaxSebSum1(int A[],int len){
int Max_sum=0,current_sum=0;
for(int i=0;i<len;i++){
for(int j=i;j<len;j++){
current_sum=0;//在计算新子列值时,先清空原值
for(int k=i;k<=j;k++){
//注意此处计算的是A[i]-A[j]间的和,计算子列和必须要有起点和终点
current_sum+=A[k];
}
if(current_sum>Max_sum){
Max_sum=current_sum;
}
}
}
return Max_sum;
}
int main(){
int K;
scanf("%d",&K);
int A[K];
for(int i=0;i<K;i++){
scanf("%d",&A[i]);
}
printf("Method one:%d",MaxSebSum1(A,K));
}
//法2:每次都扫描整个序列(但是省略了k循环,实际上k和j效果一样)
#include <cstdio>
int MaxSebSum2(int A[],int len){
int Max_sum=0,current_sum=0;
for(int i=0;i<len;i++){
current_sum=0;
for(int j=i;j<len;j++){
//从i开始加到len,每个元素都有机会
current_sum+=A[j];
if(current_sum>Max_sum){
Max_sum=current_sum;
}
}
}
return Max_sum;
}
int main(){
int K;
scanf("%d",&K);
int A[K];
for(int i=0;i<K;i++){
scanf("%d",&A[i]);
}
printf("Method two:%d",MaxSebSum2(A,K));
}
//法3:分而治之,递归+二分
#include<cstdio>
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 ){
if( left == right ) {
if( List[left] > 0 ) return List[left];
else return 0;
}
int center = ( left + right ) / 2;
int MaxLeftSum = DivideAndConquer( List, left, center );
int MaxRightSum = DivideAndConquer( List, center+1, right );
int MaxLeftBorderSum = 0,LeftBorderSum = 0;
for(int i=center;i>=left;i--){
LeftBorderSum+=List[i];
if(LeftBorderSum>MaxLeftBorderSum){
MaxLeftBorderSum=LeftBorderSum;
}
}
int MaxRightBorderSum = 0,RightBorderSum = 0;
for(int i=center+1; i<=right; i++ ) {
RightBorderSum += List[i];
if( RightBorderSum > MaxRightBorderSum )
MaxRightBorderSum = RightBorderSum;
}
return Max3( MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum );
}
int main(){
int K;
scanf("%d",&K);
int A[K];
for(int i=0;i<K;i++){
scanf("%d",&A[i]);
}
printf("Method three:%d",DivideAndConquer(A,0,K-1));
}
//法4:边读边处理
#include<cstdio>
int main(){
int K;
scanf("%d",&K);
int A[K];
int current_sum=0,Max_sum=0;
for(int i=0;i<K;i++){
scanf("%d",&A[i]);
current_sum+=A[i];
if(current_sum<0){
current_sum=0;
continue;
}else if(current_sum>Max_sum){
Max_sum=current_sum;
}
}
printf("Method three:%d",Max_sum);
}