Попробуем разобрать задачу 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].









хорош, вот я не смог ее решить