Mô tả bài toán
Dãy Bi-tonic (đôi cung) là dãy tăng dần rồi giảm dần. Cho mảng arr[], tìm dãy con Bi-tonic có tổng lớn nhất.
Ví dụ: arr = {4, 2, 3, 7, 9, 6, 3, 5, 1} → Dãy con: {2, 3, 7, 9, 6, 5, 1} = 33.
Giải pháp (Quy hoạch động)
incSeq[i]= tổng lớn nhất của dãy con tăng dần kết thúc tạii.decSeq[i]= tổng lớn nhất của dãy con giảm dần bắt đầu tạii.- Tính
incSeqtừ trái sang phải,decSeqtừ phải sang trái. - Kết quả =
max(incSeq[i] + decSeq[i] - arr[i])(trừarr[i]vì bị đếm 2 lần).
Ví dụ minh họa
#include <iostream>
using namespace std;
int calcMaxVal(int a, int b) { return a > b ? a : b; }
int findMaxSumBiTonicSubSeq(int arr[], int N) {
int maxSum = -1;
int incSeq[N], decSeq[N];
for (int i = 0; i < N; i++) incSeq[i] = decSeq[i] = arr[i];
for (int i = 1; i < N; i++)
for (int j = 0; j < i; j++)
if (arr[i] > arr[j] && incSeq[i] < incSeq[j] + arr[i])
incSeq[i] = incSeq[j] + arr[i];
for (int i = N - 2; i >= 0; i--)
for (int j = N - 1; j > i; j--)
if (arr[i] > arr[j] && decSeq[i] < decSeq[j] + arr[i])
decSeq[i] = decSeq[j] + arr[i];
for (int i = 0; i < N; i++)
maxSum = calcMaxVal(maxSum, incSeq[i] + decSeq[i] - arr[i]);
return maxSum;
}
int main() {
int arr[] = {4, 2, 3, 7, 9, 6, 3, 5, 1};
int N = sizeof(arr) / sizeof(arr[0]);
cout << "The Maximum Sum of Bi-tonic subsequence is : " << findMaxSumBiTonicSubSeq(arr, N);
return 0;
}
Đầu ra
The Maximum Sum of Bi-tonic subsequence is : 33