求连乘最大
腾讯面试题,当时没解决,现在想想,好水,不敲题半年,不知不觉ACM快散功了,现在得捡起来了~
n个数,求出最大连乘
eg:
5
-8 -2 100 -0.5 100
最大连乘为 -2*100*(-0.5)*100=10000
dp 维护正的最大,负的最小
#include <cstdlib> #include <cmath> #include<iostream> #include<cstdio> #include<iostream> using namespace std; #define maxn 100000 double a[maxn]; double dp1[maxn]; double dp2[maxn]; int n; int main() { while(~scanf("%d",&n)) { double maxx; for(int i=0;i<n;i++) scanf("%lf",&a[i]),dp1[i]=dp2[i]=0; maxx=a[0]; for(int i=0;i<n;i++) { maxx=max(maxx,a[i]); if(a[i]>0) dp1[i]=a[i]; if(a[i]<0) dp2[i]=a[i]; } for(int i=1;i<n;i++) { dp1[i]=max(max(dp1[i-1]*a[i],dp2[i-1]*a[i]),dp1[i]); dp2[i]=min(min(dp2[i-1]*a[i],dp1[i-1]*a[i]),dp2[i]); } for(int i=0;i<n;i++) maxx=max(maxx,dp1[i]); printf("%.2f\n",maxx); } return 0; }