总想法是“线性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;
}