Salvens

F

Aug 1st, 2023
1,109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3.  
  4. using namespace std;
  5.  
  6. //#define int long long
  7.  
  8. const long long INF = 1e9 + 7;
  9. const int MAXN = 1e2 + 10;
  10. const int N = 1e5 + 10;
  11.  
  12. int dp[MAXN][MAXN], can[MAXN][MAXN];
  13.  
  14. void solve() {
  15.     int n;
  16.     cin >> n;
  17.     vector<int> a(n + 1);
  18.     for (int i = 1; i <= n; ++i) {
  19.         cin >> a[i];
  20.     }
  21.     for (int i = 0; i <= n; ++i) {
  22.         for (int j = 0; j <= n; ++j) {
  23.             dp[i][j] = INF;
  24.             if (i == j) {
  25.                 dp[i][j] = 0;
  26.                 can[i][j] = 1;
  27.             }
  28.         }
  29.     }
  30.     for (int len = 2; len <= n + 1; ++len) {
  31.         for (int l = 1; l + len - 1 < n + 1; ++l) {
  32.             int r = l + len - 1;
  33.             for (int m = l; m < r; ++m) {
  34.                 if (can[l][m] > 0 && can[m][r] > 0 && (a[m] > a[l] && a[m] > a[r] || a[m] < a[l] && a[m] < a[r])) {
  35.                     can[l][r] = m;
  36.                 }
  37.             }
  38.             if (a[l] > a[r]) {
  39.                 dp[l][r] = INF;
  40.             }
  41.             if (can[l][r]) {
  42.                 dp[l][r] = len;
  43.             }
  44.             for (int m = l; m < r; ++m) {
  45.                 if (dp[l][m] != INF && dp[m][r] != INF) {
  46.                     dp[l][r] = min(dp[l][m], dp[m][r]);
  47.                 }
  48.             }
  49.         }
  50.     }
  51.     cout << dp[0][n - 1] << '\n';
  52. }
  53.  
  54. signed main() {
  55.     ios_base::sync_with_stdio(false);
  56.     cin.tie(nullptr);
  57.     cout.tie(nullptr);
  58.  
  59.     int tt = 1;
  60. //    cin >> tt;
  61.     while (tt--) {
  62.         solve();
  63.     }
  64. }
Advertisement
Add Comment
Please, Sign In to add comment