给某人开的小灶

该程序使用线性动态规划方法计算数组中连续子数组的最大乘积。初始化最大值zmax和最小值zmin为数组的第一个元素,然后遍历数组,更新zmax和zmin,同时保持最大乘积m。在处理负数和0时,动态调整zmax和zmin确保正确计算乘积。
摘要由CSDN通过智能技术生成

 总想法是“线性dp”

①首先是将这个数组输入对吧~~

②因为要保证数组连着 需要统计当前值的最大值和最小值 方便下一位的计算

然后就是定义一个存储当前较大值的地方zmax和存储当前最小值的地方zmin,以及还要一个最后统计最大乘积的m;

定义zmin的原因(但因为由于存在负数,那么会导致最大的变最小的,最小的变最大的。

因此还需要注意当前最小值zmin)

③给zmax和zmin要赋一个初值,为数组前头,即为s[0];

④再次遍历数组,这个时候,下标从1开始,直接绕过0的位置,因为0的位置已经赋给zmax,zmin,m了,再赋值给其他的话,会导致乘积紊乱

⑤将数组的值赋给a,然后b为zmax*a,c为zmin*a,判断里面的max是看是否乘到负数或者0,当遇到0时用外面的max重新让数可以动起来;如果没有0,里面一个max就行了,得到的zmax,再和m进行大小比较,使得m为最大值,输出m

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,i,j;
    int a,b,c;
    cin>>n;
    int s[n];
    for(i=0;i<n;i++)
    {
        cin>>s[i];
    }
    int zmax,zmin;
    zmax=zmin=s[0];
    int m=s[0];
    for(i=1;i<n;i++)
    {
        a=s[i];
        b=a*zmax;
        c=a*zmin;
        zmax=max(a,max(b,c));//判断里面的max是看是否乘到负数或者0,当遇到0时用外面的max重新让数可以动起来;如果没有0,里面一个max就行了
        zmin=min(a,min(b,c));//差不多道理
        m=max(m,zmax);
    }
    cout<<m;
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值