题解 | #学生查询#
连续子数组的最大乘积
http://www.nowcoder.com/practice/fd8c819c07c9493887bfac8549c119f4
本题难点在于负数的处理
我的处理过程:使用temp记录当前访问元素之前最近出现的负数的下标,
当前元素为负数时,首先先将数据累乘过去;然后当temp >= 1时,转态转移方程为:dp[i] = max(dp[i], dp[i] * dp[temp - 1]);
我的处理过程:使用temp记录当前访问元素之前最近出现的负数的下标,
当前元素为负数时,首先先将数据累乘过去;然后当temp >= 1时,转态转移方程为:dp[i] = max(dp[i], dp[i] * dp[temp - 1]);
当前元素为正数时,转态转移方程为:dp[i] = max(dp[i], dp[i] * dp[i - 1]);
#include <iostream> #include <cstdio> using namespace std; const int MAXN = 2e5 + 10; int arr[MAXN]; int dp[MAXN]; int main() { int n; while(cin >> n) { for(int i = 0; i < n; ++i) { cin >> arr[i]; dp[i] = arr[i]; } int maximum = arr[0]; int temp = -1; //记录最近负数下标 if(arr[0] < 0) { temp = 0; } for(int i = 1; i < n; ++i) { if(arr[i] < 0) { if(temp != -1) { //前面有负数就累乘过去,没负数就不管 for(int j = i - 1; j >= temp; --j) { dp[i] *= arr[j]; } if(temp >= 1) { dp[i] = max(dp[i], dp[i] * dp[temp -1]); } } temp = i; } else { dp[i] = max(dp[i], dp[i] * dp[i - 1]); } maximum = max(maximum, dp[i]); } cout << maximum << endl; } return 0; }