编程:输入数据有若干行,每行包含 � ( 1 ≤ � ≤ 18 ) N(1≤N≤18)个空格分隔的整数 � S,每个整数 � � S i 的范围为 − 10 ≤ � � ≤ 10 −10≤S i ≤10。 输出 对每行输入数据,先在单独的行中输出如Case x: ans from-to的测试样例信息,x为测试样例编号,从1开始,ans为满足要求的最大乘积及对应的起止范围,若有多个连续序列满足条件,选择范围最小的序列,若存在多个相同范围的序列,取起始位置最小的序列,起始位置从0开始计算。
时间: 2024-02-21 16:58:16 浏览: 171
下面是一份C++的代码,可以实现你的要求:
```c++
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int MAXN = 20;
int S[MAXN];
long long maxDP[MAXN], minDP[MAXN];
int main() {
int T = 0;
while (true) {
// 读入一行数据
int N;
if (!(cin >> N)) break;
for (int i = 0; i < N; i++) {
cin >> S[i];
}
// 初始化DP数组
memset(maxDP, 0, sizeof(maxDP));
memset(minDP, 0, sizeof(minDP));
maxDP[0] = minDP[0] = S[0];
// 计算DP数组
long long ans = S[0];
int from = 0, to = 0;
for (int i = 1; i < N; i++) {
if (S[i] >= 0) {
maxDP[i] = max(maxDP[i-1]*S[i], S[i]);
minDP[i] = min(minDP[i-1]*S[i], S[i]);
} else {
maxDP[i] = max(minDP[i-1]*S[i], S[i]);
minDP[i] = min(maxDP[i-1]*S[i], S[i]);
}
if (maxDP[i] > ans) {
ans = maxDP[i];
from = to = i;
}
for (int j = 0; j < i; j++) {
long long p = maxDP[j] * (j == 0 ? 1 : S[j-1]);
if (p > ans) {
ans = p;
from = j;
to = i;
}
}
}
// 输出结果
cout << "Case " << ++T << ": " << ans << " " << from << "-" << to << endl;
}
return 0;
}
```
代码的主要思路就是按照上面的动态规划算法来计算出最大乘积以及其起止范围。需要注意的是,题目中要求输出测试样例编号,所以我们需要在每次循环中手动维护一个计数器T。
阅读全文