#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));
}