最大乘积(Maximum Product,UVa 11059)
输入n个元素组成的序列s,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是整数,应输出0。 1≤n≤18, -10≤si≤10
样例输入:
5
2 5 -1 2 -1
样例输出:
20
连续子序列有两个要素:起点和终点,因此只需要枚举起点和终点即可。由于每个元素的绝对值不超过10且不超过18个元素,因此最大的乘积不会超过十的八次方,可以用long long存储。
#include<iostream>
#include<cstdio>
using namespace std;
int n,a[21];
long long s[23][23],si;
int main ()
{
while (cin>>n){
long long maxn=0;
for (int i=1;i<=n;i++) cin>>a[i];
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++){
si=1;
for (int k=i;k<=j;k++) si*=a[k];
s[i][j]=si;
if (s[i][j]>maxn){
maxn=s[i][j];
}
}
printf("%lld\n",maxn);
}
return 0;
}
我竟然用这么慢的方法做,果然我太弱了……
附带神级算法:
http://blog.csdn.net/mobius_strip/article/details/39853305
(from 小白菜又菜神犇)