Попробуем разобрать задачу G из высшей лиги Декабрьского кубка. Надеюсь, это поможет вам при решении схожих задач. Приступим к разбору: Главная идея состоит в том, что это задача на ДП. Определив тип задачи, заводим 2 массива: dp и dp1. vector <pair <int, int> > dp(n), dp1(n); dp[i].first/dp1[i].first — определяем какое максимальное к-во елочек мы можем увидеть справа/слева, если у нас есть только все деревья правее/левее i-того, включая это дерево. dp[i].second/dp1[i].second — далее определив максимальное к-во деревьев, среди них находим самое высокое.
for (int i = 1; i < n; i++) {
int f1=1,s1=h[i]; // оптимальный вариант for (int j = i - 1; j >= 0; j--) { if (dp[j].second < h[i] && (dp[j].first > f1 || // выгода, либо по к-ву, (dp[j].first >= f1 && dp[j].second <= s1))) // либо если к-во одинаковое, то где ниже самое высокое дерево { f1 = dp[j].first+1; s1 = max(dp[j].second,h[i]); } } dp[i] = { f1, s1 }; // cout << dp[i].first << "\n"; }
С dp1 — аналогично.
Ответом является сумма dp[i] и dp1[i+1].