最大子序列乘积

#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));
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值