Advertisement
a_chn

Untitled

Jun 22nd, 2024
600
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #define MAXN 55
  5.  
  6. using namespace std;
  7.  
  8. int n;
  9. int arr[MAXN];
  10. int dp[MAXN][MAXN][MAXN][MAXN];
  11.  
  12. int main() {
  13.     freopen("subrev.in", "r", stdin);
  14.     freopen("subrev.out", "w", stdout);
  15.     ios_base::sync_with_stdio(0);
  16.     cin.tie(0);
  17.     cin >> n;
  18.     for (int i = 1; i <= n; i++)
  19.         cin >> arr[i];
  20.     for (int i = 1; i <= n; i++) {
  21.         for (int a = 1; a <= arr[i]; a++) {
  22.             for (int b = arr[i]; b <= 50; b++)
  23.                 dp[i][i][a][b] = 1;
  24.         }
  25.     }
  26.     for(int i = 1; i <= n; ++i) {
  27.         for(int j = 1; j <= n; ++j) {
  28.             for(int k = 0; k <= 50; ++k) {
  29.                 for(int m = 0; m <= 50; ++m) {
  30.                     if(k > m) dp[i][j][k][m] = -1000;
  31.                 }
  32.             }
  33.         }
  34.     }
  35.  
  36.     for (int i = n; i >= 1; i--) {
  37.         for (int j = i+1; j <= n; j++) {
  38.             for (int a = 50; a >= 1; a--) {
  39.                 for (int b = a; b <= 50; b++) {
  40.                     dp[i][j][a][b] = max(dp[i+1][j][a][b], dp[i][j-1][a][b]);
  41.                     bool lim1 = (arr[i] >= a && arr[i] <= b), lim2 = (arr[j] >= a && arr[j] <= b);
  42.                     if (lim1)
  43.                         dp[i][j][a][b] = max(dp[i][j][a][b], 1 + dp[i+1][j][arr[i]][b]);
  44.                     if (lim2)
  45.                         dp[i][j][a][b] = max(dp[i][j][a][b], 1 + dp[i][j-1][a][arr[j]]);
  46.                     if (lim1 && lim2)
  47.                         dp[i][j][a][b] = max(dp[i][j][a][b], 2 + dp[i+1][j-1][min(arr[i], arr[j])][max(arr[i], arr[j])]);
  48.  
  49.                     //cases where we reverse
  50.                     if(arr[j] >= a)
  51.                         dp[i][j][a][b] = max(dp[i][j][a][b], 1 + dp[i+1][j-1][arr[j]][b]);
  52.                     if(arr[i] <= b)
  53.                         dp[i][j][a][b] = max(dp[i][j][a][b], 1 + dp[i+1][j-1][a][arr[i]]);
  54.                 }
  55.             }
  56.         }
  57.     }
  58.     /*for (int i = 1; i <= n; i++) {
  59.         for (int j = 1; j <= n; j++) {
  60.             cout << dp[i][j][1][50] << " ";
  61.         }
  62.         cout << "\n";
  63.     }*/
  64.     cout << dp[1][n][1][50];
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement