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 trong C++


Cho mảng số nguyên. Tìm tích lớn nhất của bất kỳ dãy con tăng dần nào (bất kỳ độ dài).

Thuật toán (DP類似 LIS)

  • mpis[i]: tích lớn nhất của dãy con tăng kết thúc tại i.
  • Khởi tạo mpis[i] = arr[i].
  • Với mỗi i, duyệt j < i: nếu arr[i] > arr[j] và mpis[i] < mpis[j] * arr[i] thì cập nhật.
  • Trả về max của mảng mpis.

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

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

ll lis(ll arr[], ll n) {
    ll mpis[n];
    for (int i = 0; i < n; i++) mpis[i] = arr[i];
    for (int i = 1; i < n; i++)
        for (int j = 0; j < i; j++)
            if (arr[i] > arr[j] && mpis[i] < mpis[j] * arr[i])
                mpis[i] = mpis[j] * arr[i];
    return *max_element(mpis, mpis + n);
}

int main() {
    ll arr[] = {3, 100, 4, 5, 150, 6};
    ll n = sizeof(arr) / sizeof(arr[0]);
    printf("%lld", lis(arr, n));
    return 0;
}

Đầu ra

45000