Advertisement
ivnikkk

Untitled

Jan 2nd, 2023
1,091
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "bits/stdc++.h"
  3. using namespace std;
  4. #define all(a) a.begin(), a.end()
  5. constexpr int N = 202;
  6. const int inf = 202;
  7. short pred[N][N] = {};
  8. bitset<N> dp[N];
  9. vector<short> a;
  10. void dfs(short l, short r) {
  11.     if (l + 2 == r) {
  12.         cout << l + 2 << '\n';
  13.         return;
  14.     }
  15.     short cntr = pred[l][r];
  16.     if (cntr - 1 >= l + 1) {
  17.         dfs(l, cntr);
  18.     }
  19.     if (cntr + 1 <= r - 1) {
  20.         dfs(cntr, r);
  21.     }
  22.     cout << cntr + 1 << '\n';
  23. }
  24. signed main() {
  25. #ifdef _DEBUG
  26.     freopen("input.txt", "r", stdin);
  27.     freopen("output.txt", "w", stdout);
  28. #endif
  29.     ios_base::sync_with_stdio(false);
  30.     cin.tie(nullptr);
  31.  
  32.     short n; cin >> n;
  33.     a.resize(n);
  34.     for (short i = 0; i < n; i++) {
  35.         cin >> a[i];
  36.     }
  37.     for (short i = 1; i + 1 < n; i++) {
  38.         if (a[i - 1] > a[i] && a[i] < a[i + 1] || a[i - 1] < a[i] && a[i + 1] < a[i]) {
  39.             dp[i][i] = true;
  40.             pred[i - 1][i + 1] = i;
  41.         }
  42.     }
  43.     for (short len = 2; len < n; len++) {
  44.         for (short l = 0; l + len < n; l++) {
  45.             short r = l + len;
  46.             for (short centr = l + 1; centr <= r - 1; centr++) {
  47.                 bool dp1 = (centr - 1 >= l + 1 ? dp[l + 1][centr - 1] : 1);
  48.                 bool dp2 = (centr + 1 <= r - 1 ? dp[centr + 1][r - 1] : 1);
  49.                 if ((a[centr] > a[l] && a[centr] > a[r] ||
  50.                     a[centr] < a[l] && a[centr] < a[r]
  51.                     ) && dp1 && dp2) {
  52.                     pred[l][r] = centr;
  53.                     dp[l + 1][r - 1] = 1;
  54.                     break;
  55.                 }
  56.             }
  57.         }
  58.     }
  59.     vector<short> dpmin(n + 1, inf), p(n + 1, -1);
  60.     dpmin[1] = 0;
  61.     p[1] = 1;
  62.     for (short i = 2; i <= n; i++) {
  63.         for (short j = 1; j < i; j++) {
  64.             if (dpmin[j] == inf) { continue; }
  65.             short l = j + 1, r = i - 1;
  66.             bool dp1 = (l <= r ? dp[l - 1][r - 1] : 1);
  67.             if (dp1 && a[i - 1] >= a[j - 1] && dpmin[i] > dpmin[j] + (l <= r ? r - l + 1 : 0)) {
  68.                 dpmin[i] = dpmin[j] + (l <= r ? r - l + 1 : 0);
  69.                 p[i] = j;
  70.             }
  71.         }
  72.     }
  73.     if (dpmin[n] == inf) {
  74.         cout << -1;
  75.         return 0;
  76.     }
  77.     cout << dpmin[n] << '\n';
  78.     for (short v = n; v != p[v]; v = p[v]) {
  79.         if (v - p[v] - 1 > 0) {
  80.             dfs(p[v] - 1, v - 1);
  81.         }
  82.     }
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement