算法竞赛入门经典:第七章 暴力求解法 7.2最大乘积

/*
最大乘积:
输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的成绩不是整数,应输出-1(表示无解)。1<=n<=18,-10<=Si<=10。
输入:
3
2 4 -3
5 
2 5 -1 2 -1
输出:
8
20

方法1:枚举起点和终点,注意大数要用long long表示
方法2:动态规划
max[i] = {max[i-1]*iArr[i],如果乘积大于0
         {iArr[i],等于其本身
		max[i] = {max[i-1]*iArr[i],max[i-1] > 0
		         {iArr[i],max[i-1] <= 0,这个只能用于加法,乘法似乎不好用
*/

/*
关键:
1 枚举起点和终点,注意大数要用long long表示 long long iMax = iArr[0]*iArr[1];
2 求最大子段和	max[i] = {max[i-1]*iArr[i],max[i-1] > 0
		         {iArr[i],max[i-1] <= 0,这个只能用于加法,乘法似乎不好用
  for(int i = 0;i < ;i++)
  {
	if(b > 0)
	{
		b += a[i];
	}
	else
	{
		b = a[i]
	}
	if(b > sum)
	{
		sum = b;
	}
  }
*/

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 1024

void maxProduct()
{
	int n;
	while(EOF != scanf("%d",&n))
	{
		int iArr[MAXSIZE];
		int i;
		for(i = 0;i < n;i++)
		{
			scanf("%d",&iArr[i]);
		}
		long long iMax = iArr[0]*iArr[1];
		for(int iBegin = 0 ; iBegin <i -1;iBegin++)
		{
			for(int iEnd = iBegin+1;iEnd <i ; iEnd++)
			{
				 //int iProduct = 1;
				long long iProduct;
				 for(int j = iBegin ; j <= iEnd;j++)
				 {
					iProduct *=  iArr[j];
				 }
				 if(iProduct > iMax)
				 {
					iMax = iProduct;
				 }
			}
		}
		if(iMax < 0)
		{
			printf("%d\n",-1);
		}
		else
		{
			printf("%d\n",iMax);
		}
	}
}


/*
int maxProduct(int n,int* iArr)
{
	long long product = 0,max = 0;
	for(int i = 0; i < n;i++)
	{
		if(max > 0)
		{
			max *= iArr[i];
		}
		else
		{
			max = iArr[i];
		}
		if(max > product)
		{
			product = max;
		}
	}
	return product;
}
*/

int main(int argc,char* argv[])
{
	/*
	int n,iArr[MAXSIZE];
	while(EOF != scanf("%d",&n))
	{
		for(int i = 0 ; i < n; i++)
		{
			scanf("%d",&iArr[i]);
		}
		int iProduct = maxProduct(n,iArr);
		printf("%d\n",iProduct);
	}
	*/
	maxProduct();
	system("pause");
	return 0;
}

你可能感兴趣的:(算法竞赛)