最大子序列乘积

#include

//最大子序列乘积

 

 int maxNum(int a,int b,int c){

 
int max=a;

if(b>max){

 
max=b;

 
}

if(c>max){

 
max=c;

 
}

 
return max;

 }

 int minNum(int a,int b,int c){

 
int min=a;

 
if(min>b){

 
min=b;

 
}

 
if(min>c){

 
min=c;

 
}

 
return min;

 }

 

 

//解法二 获取所有以i为结尾的最大子序列乘积,取出最大的 O(n)  

void getMaxAcc2(int a[],int len){

//max[i]是以a[i]为结尾的最大子序列乘积

//min[i]是以a[i]为结尾的最小子序列乘积 

int max[len];

int min[len];

int maxAcc=a[0];

max[0]=a[0];

min[0]=a[0];

for(int i=1;i<len;i++){

//以i为结尾的乘积最大有3种情况,1.a[i]为正,则最大为max[i-1]*a[i]

//2.a[i]为负,若min[i-1]为负,则最大为min[i-1]*a[i]

//3/若min[i-1]为正,则最大为a[i]  最小乘积同理 

max[i]=maxNum(max[i-1]*a[i],min[i-1]*a[i],a[i]);

min[i]=minNum(min[i-1]*a[i],max[i-1]*a[i],a[i]);

printf(“%d “,max[i]);

if(maxAcc<max[i]){

maxAcc=max[i];

}

printf(“最大的子序列乘积为:%d”,maxAcc);

}

//解法一 遍历所有 O(n^2) 

void getMaxAcc(int a[],int len){

int maxAcc=0;

for(int i=0;i<len;i++){

int result=1;

for(int j=i;j<len;j++){

result*=a[j];

if(result>maxAcc){

maxAcc=result;

//printf(“最大子序列和为:%d\n”,maxAcc);

}

}

}

printf(“最大子序列和为:%d”,maxAcc);

 

int main(){

int test[]={-2,11,-4,13,-5,-2};

getMaxAcc2(test,sizeof(test)/sizeof(int));

点赞