Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <cstring>
- #define MAXN 55
- using namespace std;
- int n;
- int arr[MAXN];
- int dp[MAXN][MAXN][MAXN][MAXN];
- int main() {
- freopen("subrev.in", "r", stdin);
- freopen("subrev.out", "w", stdout);
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cin >> n;
- for (int i = 1; i <= n; i++)
- cin >> arr[i];
- for (int i = 1; i <= n; i++) {
- for (int a = 1; a <= arr[i]; a++) {
- for (int b = arr[i]; b <= 50; b++)
- dp[i][i][a][b] = 1;
- }
- }
- for(int i = 1; i <= n; ++i) {
- for(int j = 1; j <= n; ++j) {
- for(int k = 0; k <= 50; ++k) {
- for(int m = 0; m <= 50; ++m) {
- if(k > m) dp[i][j][k][m] = -1000;
- }
- }
- }
- }
- for (int i = n; i >= 1; i--) {
- for (int j = i+1; j <= n; j++) {
- for (int a = 50; a >= 1; a--) {
- for (int b = a; b <= 50; b++) {
- dp[i][j][a][b] = max(dp[i+1][j][a][b], dp[i][j-1][a][b]);
- bool lim1 = (arr[i] >= a && arr[i] <= b), lim2 = (arr[j] >= a && arr[j] <= b);
- if (lim1)
- dp[i][j][a][b] = max(dp[i][j][a][b], 1 + dp[i+1][j][arr[i]][b]);
- if (lim2)
- dp[i][j][a][b] = max(dp[i][j][a][b], 1 + dp[i][j-1][a][arr[j]]);
- if (lim1 && lim2)
- 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])]);
- //cases where we reverse
- if(arr[j] >= a)
- dp[i][j][a][b] = max(dp[i][j][a][b], 1 + dp[i+1][j-1][arr[j]][b]);
- if(arr[i] <= b)
- dp[i][j][a][b] = max(dp[i][j][a][b], 1 + dp[i+1][j-1][a][arr[i]]);
- }
- }
- }
- }
- /*for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= n; j++) {
- cout << dp[i][j][1][50] << " ";
- }
- cout << "\n";
- }*/
- cout << dp[1][n][1][50];
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement