2 条题解
-
0
- 由于求的是最大乘积,而且有负数
- 所以需要同时维护 乘积最大值,乘积最小值
- 由于每个状态只与上一个状态相关(之前的状态已经没用),可以把数组省掉,只开 个变量
#include <bits/stdc++.h> using namespace std; int maxProduct(vector<int>& a) { int n = a.size(); // ma(i): 以 a(i) 结尾的最大子数组乘积 // mi(i): 以 a(i) 结尾的最小子数组乘积 int ma = a[0], mi = a[0], ans = a[0]; for (int i = 1; i < n; i++) { int x = a[i] * ma; int y = a[i] * mi; ma = max(a[i], max(x, y)); mi = min(a[i], min(x, y)); ans = max(ans, ma); } return ans; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; i++) cin >> a[i]; cout << maxProduct(a) << '\n'; return 0; } -
0
- 由于求的是最大乘积,而且有负数
- 所以需要同时维护 乘积最大值,乘积最小值
#include <bits/stdc++.h> using namespace std; int maxProduct(const vector<int>& a) { int n = a.size(); // ma(i): 以 a(i) 结尾的最大子数组乘积 // mi(i): 以 a(i) 结尾的最小子数组乘积 vector<int> ma(n), mi(n); int ans = 0; ma[0] = a[0], mi[0] = a[0]; for (int i = 1; i < n; i++) { int x = a[i] * ma[i - 1]; int y = a[i] * mi[i - 1]; ma[i] = max(a[i], max(x, y)); mi[i] = min(a[i], min(x, y)); ans = max(ans, ma[i]); } return *max_element(ma.begin(), ma.end()); } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; i++) cin >> a[i]; cout << maxProduct(a) << '\n'; return 0; }
- 1
信息
- ID
- 174
- 时间
- 100ms
- 内存
- 32MiB
- 难度
- 3
- 标签
- 递交数
- 63
- 已通过
- 35
- 上传者