Mô tả bài toán
Tìm tích lớn nhất mảng con liên tiếp bằng cách duyệt 2 chiều: trái→phải và phải→trái.
Ví dụ: {4, -2, 5, -6, 0, 8} → Mảng con {4, -2, 5, -6} = 240.
Giải pháp (Hai lần duyệt)
- Duyệt trái→phải: tích lũy, reset khi gặp 0.
- Duyệt phải→trái: tương tự.
- Kết quả = max của hai lần duyệt.
- Lưu ý: Cách này không xử lý đúng tất cả trường hợp (ví dụ số âm lẻ ở giữa), giải pháp Kadane biến thể (bài trước) chính xác hơn.
Ví dụ minh họa
#include <iostream>
using namespace std;
int CalcMaxProductSubArray(int arr[], int n) {
int frntMax = 1, rearMax = 1, maxVal = 1;
for (int i = 0; i < n; i++) {
frntMax *= arr[i];
if (frntMax == 0) frntMax = 1;
}
for (int i = n-1; i >= 0; i--) {
rearMax *= arr[i];
if (rearMax == 0) rearMax = 1;
}
maxVal = max(frntMax, rearMax);
return maxVal;
}
int main() {
int arr[] = {4, -2, 5, -6, 0, 8};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Maximum product subarray is " << CalcMaxProductSubArray(arr, n);
return 0;
}
Đầu ra
Maximum product subarray is 240