最大子序列之积

本文介绍了一种类似于求最大子序列和的算法,但目标转为求最大子序列的乘积。通过递归划分数组,并计算左右两侧的最大正积与最小负积,最终找出最大乘积。关键在于处理中间部分时,考虑两边最小负积相乘或最大正积相乘的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要:类似于求最大子序列的和,将目标改为求积.最重要的改变是在求中间部分时。
(1)最大之积一定是由两边的最小负积相乘或者两边的最大正积相乘得到。因此在这一部分计算量有O(N)->O(4N);当然,总的时间界还是O(NlogN);

static int Maxsub(const int A[],int Left, int Right)
{
    int Max_Left,Max_Right;
    int center;;
    int LeftBodersum[2] = {1},RightBodersum[2] = {1};
    int Max_LeftBodersum[2] = {0}, Max_RightBodersum[2] = {0};
    int Max_mid;

    if (Left == Right)//处理基准情况
    {
        if (A[Left]>0)
            return A[Left];
        else
            return 0;
    }
    center = (Left + Right)/2;
    Max_Left = Maxsub(A,Left,center);
    Max_Right = Maxsub(A,center+1,Right);
    for (int i = center;i>=Left;i--)
    {
        //求解最大正之积
        LeftBodersum[Positive] *=A[i];
        if (LeftBodersum[Positive] >= Max_LeftBodersum[Positive])
            Max_LeftBodersum[Positive] = LeftBodersum[Positive];
        //求解最大负之积
        LeftBodersum[Negative] *=A[i];
        if (LeftBodersum[Negative] <= Max_LeftBodersum[Negative])
            Max_LeftBodersum[Negative] = LeftBodersum[Negative];
    }
    for (int i = center+1;i<=Right;i++)
    {
        //positive
        RightBodersum[Positive] *=A[i];
        if (RightBodersum[Positive] >= Max_RightBodersum[Positive])
            Max_RightBodersum[Positive] = RightBodersum[Positive];
        // negative
        RightBodersum[Negative] *=A[i];
        if (RightBodersum[Negative] <= Max_RightBodersum[Negative])
            Max_RightBodersum[Negative] = RightBodersum[Negative];
    }
    int a =(Max_LeftBodersum[Positive] * Max_RightBodersum[Positive]);
    int b =(Max_LeftBodersum[Negative] * Max_RightBodersum[Negative]) ;
    Max_mid = a>b?a:b;
    return Max3(Max_Left,Max_Right,Max_mid);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值