最大乘积 Uva 11059

输入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;
 } 

结果如图:
这里写图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值