最大连续乘积子串

给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出
的最大乘积连续子串为3,0.5,8。也就是说,上述数组中,3 0.5 8 这3 个数的乘积3*0.5*8=12
是最大的,而且是连续的。

跟以前写的这道题http://blog.csdn.net/gao1440156051/article/details/43498407
求子数组的最大和很像。

不同点就在于,最小的负数乘以负数可能就变成最大。

用动态规划,状态转化方程为:
Max=max{a, Max[i-1]*a, Min[i-1]*a};
Min=min{a, Max[i-1]*a, Min[i-1]*a};
初始状态为Max[1]=Min[1]=a[1]。

#include <iostream>
#include <cstdlib>
using namespace std;

double max(double a,double maxArry,double minArry){
    double maxRes=a;
    if(maxArry>maxRes)
        maxRes=maxArry;
    else if(minArry>maxRes)
        maxRes=minArry;
    return maxRes;
}

double min(double a,double maxArry,double minArry){
    double minRes=a;
    if(maxArry<minRes)
        minRes=maxArry;
    else if(minArry<minRes)
        minRes=minArry;

    return minRes;
}


double maxSubProduct(double *data,int length){
    if(data==NULL)
        exit(-1);

    double maxRes=data[0];
    double *maxArry=new double[length];
    double *minArry=new double[length];

    maxArry[0]=minArry[0]=data[0];
    for(int i=1;i<length;i++){
        maxArry[i]=minArry[i]=data[i];
        maxArry[i]=max(data[i],maxArry[i-1]*data[i],minArry[i-1]*data[i]);
        minArry[i]=min(data[i],maxArry[i-1]*data[i],minArry[i-1]*data[i]);

        if(maxArry[i]>maxRes){
            maxRes=maxArry[i];
        }
    }

    delete maxArry;
    delete minArry;

    return maxRes;
}

int main(){

    double data[]={-2.5,4,0,3,0.5,8,-1};
    int length=7;
    cout<<maxSubProduct(data,length)<<endl;

    system("pause");
}

结果是12

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值