Advertisement
Guest User

Untitled

a guest
Apr 18th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.32 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define eprintf(...) fprintf(stderr, __VA_ARGS__)
  6. #define pb push_back
  7. #define mp make_pair
  8.  
  9. typedef long long ll;
  10.  
  11. typedef vector<ll> vll;
  12. typedef vector<int> vi;
  13. typedef vector<vi> vvi;
  14. typedef vector<bool> vb;
  15.  
  16. const int INF = 1e9;
  17.  
  18. bool can(int h1, int h2, int h3) {
  19.   if (h1 < h2 && h3 < h2) return true;
  20.   if (h1 > h2 && h3 > h2) return true;
  21.   return false;
  22. }
  23.  
  24. vvi del;
  25. vvi dyn, fr;
  26. vi ans;
  27.  
  28. // a и b - границы интервала, на котором хотим срубить все деревья
  29. void deleteAll(int a, int b) {
  30.   assert(del[a][b] >= 0);
  31.   if (del[a][b] == a) return;
  32.   deleteAll(a, del[a][b]);
  33.   deleteAll(del[a][b], b);
  34.   ans.push_back(del[a][b]);
  35. }
  36.  
  37. // аналогично
  38. void restoreAns(int a, int b) {
  39.   assert(fr[a][b] >= 0);
  40.   if (fr[a][b] == a) {
  41.     deleteAll(a, b);
  42.     return;
  43.   }
  44.   restoreAns(a, fr[a][b]);
  45.   restoreAns(fr[a][b], b);
  46. }
  47.  
  48. int main() {
  49.   int n;
  50.   while (scanf("%d", &n) >= 1) {
  51.     vi h(n);
  52.     for (int i = 0; i < n; i++) scanf("%d", &h[i]);
  53.  
  54.     del = vvi(n, vi(n, -1));
  55.     for (int a = 0; a + 1 < n; a++)
  56.       del[a][a + 1] = a;
  57.  
  58.     for (int l = 2; l < n; l++)
  59.       for (int a = 0; a + l < n; a++) {
  60.         int b = a + l;
  61.         for (int i = a + 1; i < b; i++)
  62.           if (del[a][i] >= 0 && del[i][b] >= 0 && can(h[a], h[i], h[b])) {
  63.             del[a][b] = i;
  64.             break;
  65.           }
  66.       }
  67.  
  68.     dyn = vvi(n, vi(n, INF));
  69.     fr = vvi(n, vi(n, -1));
  70.     for (int l = 1; l < n; l++)
  71.       for (int a = 0; a + l < n; a++) {
  72.         int b = a + l;
  73.         if (h[a] > h[b]) continue;
  74.         if (del[a][b] >= 0) {
  75.           dyn[a][b] = b - a - 1;
  76.           fr[a][b] = a;
  77.         }
  78.  
  79.         for (int i = a + 1; i < b; i++) {
  80.           if (h[a] > h[i] || h[i] > h[b]) continue;
  81.           int cans = dyn[a][i] + dyn[i][b];
  82.           if (dyn[a][b] > cans) {
  83.             dyn[a][b] = cans;
  84.             fr[a][b] = i;
  85.           }
  86.         }
  87.       }
  88.  
  89.     int a = 0, b = n - 1;
  90.     if (fr[0][n - 1] < 0) printf("-1\n");
  91.     else {
  92.       ans = vi();
  93.       restoreAns(a, b);
  94.       printf("%d\n", ans.size());
  95.       for (int i = 0; i < ans.size(); i++)
  96.         printf("%d\n", ans[i] + 1);
  97.     }
  98.  
  99.     #ifndef DEBUG
  100.     break;
  101.     #endif
  102.   }
  103.   return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement