1. 程式人生 > >UVa 11059 最大乘積(列舉)

UVa 11059 最大乘積(列舉)

輸入n個元素組成的序列s,你需要找出一個乘積最大的的連續子序列。如果這個最大的的乘積不是正數,輸出-1.1<=n<=18,-10<=Si<=10;

樣例輸入: 3 2 4 -3 5 2 5 -1 2 -1 樣例輸出:

20
分析:連續子序列有兩個要素:起點和終點,因此只需列舉起點和終點即可。由於每個元素的絕對值不超過10,一共又不超過18個元素,最大可能的乘積不會超過10^18,可以用long long 存下。
#include <stdio.h>

int main() {
	int n, a[20];
	while (scanf("%d", &n) == 1) {
		for (int i = 0; i < n; i++)
			scanf("%d", &a[i]);
		long long max = 0;
		for (int i = 0; i < n - 1; i++) { //列舉起點
			for (int j = 1; j < n; j++) { //列舉終點
				long long num = 1;
				for (int k = i; k <= j; k++) {
					num *= a[k];
				}
				if (max < num)
					max = num;
			}
		}
		printf("%lld\n", max);
	}
	return 0;
}
#include <stdio.h>

int main() {
	int n, a[20];
	while (scanf("%d", &n) == 1) {
		for (int i = 0; i < n; i++)
			scanf("%d", &a[i]);
		long long max = 0;
		for (int i = 1; i <= n; i++) {  <span><span></span><span class="comment">  // i:子序列長度 </span><span></span></span>
			for (int j = 0; j + i <= n; j++) {     <span><span class="comment">// j:子序列起點</span></span>
				long long num = 1;
				for (int k = j; k < j + i; k++)    <span><span></span><span class="comment">// 累乘</span></span>
					num *= a[k];
				if (num > max)
					max = num;
			}
		}
		printf("%lld\n", max);
	}
	return 0;
}