输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出0(表示 无解)。
1<=n<=18,-10<=si<=10.
这里我并不是在UVa里面做的题目,所以代码也没有经过测试,只是能通过这些样例~
另外,我看其他人写的答案,都是输入一组样例的,我是输入多组的,不知道题目到底要求的是什么~但是还是按多组来了(题目来自于《算法竞赛入门经典》)
分析:
连续子序列有两个要素:起点和终点,如下图分析
由于每个元素的绝对值不超过10且不超过18个元素,最大可能的乘积不会超过10^18,可以用long long 存储。
代码:
#include<iostream>
using namespace std;
long long Max[100];//最大乘积不会超过10^18,用long long类型
int a[100][20];
int b[20];//记录每行有多少个数字
int main()
{
for(int i=0;i<100;i++)
{
Max[i]=0;
}
int currVal=0;
int cnt=0;//记录有多少行(几组数据)
while(cin>>currVal)
{
for(int i=0;i<currVal;i++)
{
cin>>a[cnt][i];//把每组数据的每个值存入到那一行中去
}
b[cnt]=currVal;//记录当前行有几个值(因为每一组输入多少个值是不确定的)
cnt++;
}
//对数据进行操作,找出最大连续子序列
for(int l=0;l<cnt;l++)//对每一组进行遍历
{
for(int i=0;i<b[l];i++)//对每一行i遍历
{
for(int j=i+1;j<b[l];j++)//对每一行里面的每一个元素j遍历
{
int sum=1;
for(int k=i;k<=j;k++)//只要枚举起点和终点就好
{
sum=sum*a[l][k];
}
if(sum>Max[l])//判断是否为最大,最大就保存
{
Max[l]=sum;
}
}
}
}
for(int i=0;i<cnt;i++)//输出每一组的最大连乘子序列
{
cout<<Max[i]<<endl;
}
return 0;
}
结果如图: