最大乘积 Uva 11059

输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出0(表示 无解)。

1<=n<=18,-10<=si<=10.
最大乘积 Uva 11059_第1张图片

这里我并不是在UVa里面做的题目,所以代码也没有经过测试,只是能通过这些样例~
另外,我看其他人写的答案,都是输入一组样例的,我是输入多组的,不知道题目到底要求的是什么~但是还是按多组来了(题目来自于《算法竞赛入门经典》)

分析:
连续子序列有两个要素:起点和终点,如下图分析
最大乘积 Uva 11059_第2张图片

由于每个元素的绝对值不超过10且不超过18个元素,最大可能的乘积不会超过10^18,可以用long long 存储。
代码:

#include
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;icin>>a[cnt][i];//把每组数据的每个值存入到那一行中去
        }
        b[cnt]=currVal;//记录当前行有几个值(因为每一组输入多少个值是不确定的)
        cnt++;
    }
    //对数据进行操作,找出最大连续子序列
    for(int l=0;l//对每一组进行遍历 
    {       
        for(int i=0;i//对每一行i遍历 
        {
            for(int j=i+1;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//输出每一组的最大连乘子序列
    {
        cout<return 0;
 } 

结果如图:
最大乘积 Uva 11059_第3张图片

你可能感兴趣的:(#,暴力求解)