ZhongJiaXuan

P4342 [IOI1998] Polygon

Dec 15th, 2023
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.45 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N = 105;
  5. int n, ans = INT_MIN;
  6. int a[105];
  7. int f[150][150], g[150][150];
  8. char c[105];
  9. signed main() {
  10.     cin >> n;
  11.     for (int i = 1; i <= n; i++) {
  12.         cin >> c[i] >> a[i];
  13.         a[n + i] = a[i];
  14.         c[n + i] = c[i];
  15.     }
  16.     for (int i = 1; i <= (n << 1); i++) {
  17.         for (int j = 1; j <= (n << 1); j++) {
  18.             f[i][j] = INT_MIN, g[i][j] = INT_MAX;
  19.         }
  20.     }
  21.     for (int i = 1; i <= (n << 1); i++) f[i][i] = g[i][i] = a[i];
  22.     for (int len = 2; len <= n; len++) {
  23.         for (int i = 1, j = len; j <= (n << 1); i++, j++) {
  24.             for (int k = i; k < j; k++) {
  25.                 if (c[k + 1] == 'x') {
  26.                     f[i][j] = max(f[i][j], max(f[i][k] * f[k + 1][j], max(g[i][k] * g[k + 1][j], max(f[i][k] * g[k + 1][j], g[i][k] * f[k + 1][j]))));
  27.                     g[i][j] = min(g[i][j], min(f[i][k] * f[k + 1][j], min(g[i][k] * g[k + 1][j], min(f[i][k] * g[k + 1][j], g[i][k] * f[k + 1][j]))));
  28.                 } else if (c[k + 1] == 't') {
  29.                     f[i][j] = max(f[i][j], f[i][k] + f[k + 1][j]);
  30.                     g[i][j] = min(g[i][j], g[i][k] + g[k + 1][j]);
  31.                 }
  32.             }
  33.         }
  34.     }
  35.     for (int i = 1; i <= n; i++) ans = max(ans, f[i][i + n - 1]);
  36.     cout << ans << '\n';
  37.     for (int i = 1; i <= n; i++)
  38.         if (f[i][i + n - 1] == ans) cout << i << ' ';
  39.     return 0;
  40. }
  41.  
Advertisement
Add Comment
Please, Sign In to add comment