今儿个又看一题 意为:
输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正整,应输出-1(表示无解)。1≤n≤18,-10≤Si≤10。
样例输入:
3
2 4 -3
5
2 5 -1 2 -1
样例输出:
8
20
这道题也是一道纯纯的枚举习题
我们先做一下分析
连续子序列有两个要素:起点和终点,
因此只需要枚举起点和终点即可。
由于每个元素的绝对值不超过10,一共又不超过18个元素,最大可能的乘积示会超过1028,
可以用long 存下。
核心代码:
long ans = 0; // 存放最大的乘积
for (int i = 0; i < n; i++) {
//从序列中的第0个元素开始,枚举最大连续乘积,并用ans存储
long temp = 1;
for (int j = i; j < n; j++) {
temp *= a[j];
if (temp > ans)
ans = temp;
}
}
整体代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int[] a = new int[20]; // 存放输入序列的每一个元素
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) { // 输入序列中元素的个数n
int n = sc.nextInt();// 输入元素的个数
for (int i= 0; i < n; i++) // 输入序列中的元素
a[i] = sc.nextInt();
long ans = 0; // 存放最大的乘积
for (int i = 0; i < n; i++) {
//从序列中的第0个元素开始,枚举最大连续乘积,并用ans存储
long temp = 1;
for (int j = i; j < n; j++) {
temp *= a[j];
if (temp > ans)
ans = temp;
}
}
if (ans > 0)
System.out.printf("%d\n", ans);
else
System.out.printf("%d\n", -1);
}
}
}
运行结果:

本文介绍了一种解决最大连续子序列乘积问题的方法。通过枚举起点和终点来找到乘积最大的连续子序列,适用于元素数量不超过18且每个元素绝对值不大于10的情况。
3601

被折叠的 条评论
为什么被折叠?



