Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Tích lớn nhất mảng con - Duyệt hai chiều trong C++


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