Diamond-_-'s blog

By Diamond-_-, 3 years ago, In Russian

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

Code

  • Vote: I like it
  • +13
  • Vote: I do not like it