最大子序列乘积

来源:互联网 发布:淘宝上门取件在哪里 编辑:程序博客网 时间:2024/06/04 23:28
#include<stdio.h>
//最大子序列乘积
 
 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));
0 0
原创粉丝点击