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

Tích lớn nhất của dãy con tăng dần độ dài 3 trong C++


Cho mảng số nguyên dương. Tìm dãy con 3 phần tử tăng dần có tích lớn nhất.

Thuật toán

  • Dùng set duyệt từ trái sang phải tìm phần tử nhỏ hơn gần nhất bên trái (smaller[i]).
  • Duyệt từ phải sang trái theo dõi max_right (phần tử lớn nhất bên phải).
  • Với mỗi i làm phần tử giữa: nếu có smaller[i] và arr[i] < max_right → cập nhật kết quả.

Ví dụ triển khai (C++)

#include <bits/stdc++.h>
using namespace std;

long long int maxProduct(int arr[], int n) {
    int smaller[n];
    smaller[0] = -1;
    set<int> S;
    for (int i = 0; i < n; i++) {
        auto it = S.insert(arr[i]).first;
        if (it != S.begin()) { --it; smaller[i] = *it; }
        else smaller[i] = -1;
    }
    long long int result = LLONG_MIN;
    int max_right = arr[n-1];
    for (int i = n-2; i >= 1; i--) {
        if (arr[i] > max_right) max_right = arr[i];
        else if (smaller[i] != -1)
            result = max(result, 1LL * smaller[i] * arr[i] * max_right);
    }
    return result;
}

int main() {
    int arr[] = {10, 11, 9, 5, 6, 1, 20};
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << maxProduct(arr, n) << endl;
    return 0;
}

Đầu ra

2200