Trong bài toán này, chúng ta đưa ra một mảng arr [] có kích thước n. Nhiệm vụ của chúng tôi là tìm ra sản phẩm tối ưu của một phân khúc ngày càng tăng.
Mô tả sự cố - Chúng ta cần tìm tích số tối đa của việc tăng dần dãy con với bất kỳ kích thước nào có thể từ các phần tử của mảng.
Hãy lấy một ví dụ để hiểu vấn đề,
Đầu vào
arr[] = {5, 4, 6, 8, 7, 9}
Đầu ra
2160
Giải thích
All Increasing subsequence: {5,6,8,9}. Prod = 2160 {5,6,7,9}. Prod = 1890 Here, we have considered only max size subsequence.
Phương pháp tiếp cận giải pháp
Một giải pháp đơn giản cho vấn đề là sử dụng phương pháp lập trình động. Đối với điều này, chúng tôi sẽ lưu trữ dãy con tăng dần sản phẩm tối đa cho đến phần tử đã cho của mảng và sau đó lưu trữ trong một mảng.
Thuật toán
Khởi tạo -
prod[] with elements of arr[]. maxProd = −1000
Bước 1 -
Loop for i −> 0 to n−1
Bước 1.1 -
Loop for i −> 0 to i
Bước 1.1.1
Check if the current element creates an increasing subsequence i.e. arr[i]>arr[j] and arr[i]*prod[j]> prod[i] −> prod[i] = prod[j]*arr[i]
Bước 2 -
find the maximum element of the array. Following steps 3 and 4.
Bước 3 -
Loop form i −> 0 to n−1
Bước 4 -
if(prod[i] > maxProd) −> maxPord = prod[i]
Bước 5 -
return maxProd.
Ví dụ
Chương trình hiển thị việc triển khai giải pháp của chúng tôi,
#include <iostream> using namespace std; long calcMaxProdSubSeq(long arr[], int n) { long maxProdSubSeq[n]; for (int i = 0; i < n; i++) maxProdSubSeq[i] = arr[i]; for (int i = 1; i < n; i++) for (int j = 0; j < i; j++) if (arr[i] > arr[j] && maxProdSubSeq[i] < (maxProdSubSeq[j] * arr[i])) maxProdSubSeq[i] = maxProdSubSeq[j] * arr[i]; long maxProd = −1000 ; for(int i = 0; i < n; i++){ if(maxProd < maxProdSubSeq[i]) maxProd = maxProdSubSeq[i]; } return maxProd; } int main() { long arr[] = {5, 4, 6, 8, 7, 9}; int n = sizeof(arr) / sizeof(arr[0]); cout<<"The maximum product of an increasing subsequence is "<<calcMaxProdSubSeq(arr, n); return 0; }
Đầu ra
The maximum product of an increasing subsequence is 2160