joylintp

Untitled

Nov 11th, 2021
668
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.99 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. //{
  5. //#pragma gcc optimize("Ofast,unroll-loops")
  6. //#pragma gcc target("sse,sse2,sse3,ssse3,sse4,avx,avx2,fma,abm,mmx,popcnt,tune=native")
  7. //#define int long long
  8. //#define double long double
  9. #define MP make_pair
  10. #define F first
  11. #define S second
  12. #define MOD 998244353
  13. //}
  14.  
  15. int N;
  16. vector<int> a;
  17. vector<vector<int>> cg;
  18. vector<vector<long long>> dp;
  19.  
  20. long long solve(int l, int r)
  21. {
  22.     if (dp[l][r])
  23.         return dp[l][r];
  24.  
  25.     if (l == r)
  26.         dp[l][r] = -1;
  27.     else if (l + 1 == r)
  28.         if (cg[l][l + 1] > 1)
  29.             dp[l][r] = cg[l][l + 1];
  30.         else
  31.             dp[l][r] = -1;
  32.     else if (l + 2 == r)
  33.         if (cg[l][l + 1] > 1 && cg[l][l + 2] > 1 && cg[l + 1][l + 2] > 1)
  34.             dp[l][r] = cg[l][l + 1] + cg[l + 1][l + 2];
  35.         else
  36.             dp[l][r] = -1;
  37.     else
  38.     {
  39.         long long ret = -1;
  40.         if (cg[l][r] > 1)
  41.         {
  42.             long long t = solve(l + 1, r - 1);
  43.             if (t != -1)
  44.                 ret = max(ret, t + cg[l][r]);
  45.         }
  46.  
  47.         for (int i = l; i + 1 <= r; i++)
  48.             if (cg[i][i + 1] > 1)
  49.             {
  50.                 long long ta = 0, tb = 0;
  51.                 if (i > l)
  52.                     ta = solve(l, i - 1);
  53.                 if (i + 1 < r)
  54.                     tb = solve(i + 2, r);
  55.                 if (ta != -1 && tb != -1)
  56.                     ret = max(ret, ta + tb + cg[i][i + 1]);
  57.             }
  58.  
  59.         for (int i = l + 1; i < r; i++)
  60.             if (cg[l][i] > 1 && cg[l][r] > 1 && cg[i][r] > 1)
  61.             {
  62.                 long long ta = 0, tb = 0;
  63.                 if (i - 1 > l)
  64.                     ta = solve(l + 1, i - 1);
  65.                 if (i + 1 < r)
  66.                     tb = solve(i + 1, r - 1);
  67.                 if (ta != -1 && tb != -1)
  68.                     ret = max(ret, ta + tb + cg[l][i] + cg[i][r]);
  69.             }
  70.  
  71.         for (int i = l + 1; i < r; i++)
  72.         {
  73.             long long ta = solve(l, i - 1), tb = solve(i, r);
  74.             if (ta != -1 && tb != -1)
  75.                 ret = max(ret, ta + tb);
  76.         }
  77.  
  78.         dp[l][r] = ret;
  79.     }
  80.     return dp[l][r];
  81. }
  82.  
  83. signed main()
  84. {
  85.     ios_base::sync_with_stdio(false);
  86.     cin.tie(0);
  87.  
  88.     cin >> N, a.resize(N), cg.resize(N), dp.resize(N);
  89.     for (int i = 0; i < N; i++)
  90.         cin >> a[i], cg[i].resize(N), dp[i].resize(N);
  91.  
  92.     for (int i = 0; i < N; i++)
  93.         for (int j = 0; j < N; j++)
  94.             cg[i][j] = __gcd(a[i], a[j]);
  95.  
  96.     cout << solve(0, N - 1) << '\n';
  97.  
  98.     return 0;
  99. }
  100.  
  101. //      *****  *****  *   *  *      *****  *   *  *****  *****
  102. //        *   *   *  *   *  *        *    **  *    *    *   *
  103. //       *   *   *  *****  *        *    * * *    *    *****
  104. //   *  *   *   *    *    *        *    *  **    *    *
  105. //  ****   *****    *    *****  *****  *   *    *    *
  106.  
  107. //     *   *   ***   *   *  **
  108. //    *   *  *   *  *   *  **
  109. //   * * *  *****  *****  **
  110. //  * * *  *   *  *   *
  111. //  * *   *   *  *   *  **
  112.  
Advertisement
Add Comment
Please, Sign In to add comment