Advertisement
tsypko

B

Jul 10th, 2021
543
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.10 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3.  
  4. const int N = 2000;
  5. std::vector<bool> ans[N];
  6. int n, o[N][N];
  7. long long d[N][N], p[N];
  8.  
  9. void run(int l = 0, int r = n - 1, std::vector<bool> prev = std::vector<bool>())
  10. {
  11.     if (l == r) ans[l] = prev;
  12.     else {
  13.         prev.push_back(false);
  14.         run(l, o[l][r], prev);
  15.         prev.back() = true;
  16.         run(o[l][r] + 1, r, prev);
  17.     }
  18. }
  19.  
  20. int main()
  21. {
  22.     scanf("%d", &n);
  23.     for (int i = 0; i < n; ++i) {
  24.         scanf("%lld", p + i);
  25.         if (i) p[i] += p[i - 1];
  26.     }
  27.     for (int i = 0; i < n - 1; ++i) {
  28.         o[i][i + 1] = i;
  29.         d[i][i + 1] = p[i + 1] - (i ? p[i - 1] : 0);
  30.     }
  31.     for (int i = 2; i < n; ++i) {
  32.         for (int j = 0; j + i < n; ++j) {
  33.             d[j][j + i] = ~((long long)1 << 63);
  34.             for (int k = o[j][j + i - 1]; k <= o[j + 1][j + i]; ++k) {
  35.                 long long x = d[j][k] + d[k + 1][j + i];
  36.                 if (x < d[j][j + i]) {
  37.                     d[j][j + i] = x;
  38.                     o[j][j + i] = k;
  39.                 }
  40.             }
  41.             d[j][j + i] += p[j + i] - (j ? p[j - 1] : 0);
  42.         }
  43.     }
  44.     run(0, n - 1);
  45.     for (int i = 0; i < n; ++i) {
  46.         for (int j = 0; j < (int)ans[i].size(); ++j) printf("%d", (int)ans[i][j]);
  47.         printf("\n");
  48.     }
  49.     return 0;
  50. }
  51.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement