Dang_Quan_10_Tin

LISLCS

Mar 24th, 2022 (edited)
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.40 KB | None | 0 0
  1. #define task "LISLCS"
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. using ll = long long;
  9. using ld = long double;
  10.  
  11. constexpr int N = 5e3 + 5;
  12. int m, n;
  13. int a[N], b[N];
  14.  
  15. void Read()
  16. {
  17.     cin >> m >> n;
  18.  
  19.     for (int i = 1; i <= m; ++i)
  20.         cin >> a[i];
  21.     for (int i = 1; i <= n; ++i)
  22.         cin >> b[i];
  23. }
  24.  
  25. int lcs[N][N], f[2][N][N];
  26.  
  27. void Sub_2()
  28. {
  29.     for (int i = 1; i <= m; ++i)
  30.     {
  31.         for (int j = 1; j <= n; ++j)
  32.         {
  33.             if (a[i] == b[j])
  34.                 lcs[i][j] = lcs[i - 1][j - 1] + 1;
  35.             else
  36.                 lcs[i][j] = max(lcs[i - 1][j], lcs[i][j - 1]);
  37.         }
  38.  
  39.         int p = i & 1, np = !(i & 1);
  40.  
  41.         for (int j = 1; j <= n; ++j)
  42.             if (a[i] == b[j])
  43.             {
  44.  
  45.                 for (int t = 1, maxn = 0; t <= 500; ++t)
  46.                 {
  47.                     f[p][j][t] = 0;
  48.  
  49.                     f[p][j][t] = max(f[p][j][t], f[np][j - 1][t]);
  50.  
  51.                     if (lcs[i][j] == lcs[i][j - 1])
  52.                         f[p][j][t] = max(f[p][j][t], f[p][j - 1][t]);
  53.                     if (lcs[i][j] == lcs[i - 1][j])
  54.                         f[p][j][t] = max(f[p][j][t], f[np][j][t]);
  55.  
  56.                     if (t < a[i])
  57.                         maxn = max(maxn, f[np][j - 1][t]);
  58.                     else if (t == a[i])
  59.                         f[p][j][t] = max(f[p][j][t], maxn + 1);
  60.                 }
  61.             }
  62.             else
  63.             {
  64.                 for (int t = 1; t <= 500; ++t)
  65.                 {
  66.                     f[p][j][t] = 0;
  67.                     if (lcs[i][j] == lcs[i][j - 1])
  68.                         f[p][j][t] = max(f[p][j][t], f[p][j - 1][t]);
  69.                     if (lcs[i][j] == lcs[i - 1][j])
  70.                         f[p][j][t] = max(f[p][j][t], f[np][j][t]);
  71.                 }
  72.             }
  73.     }
  74.  
  75.     int ans(0);
  76.  
  77.     for (int t = 1; t <= 500; ++t)
  78.         ans = max(ans, f[m & 1][n][t]);
  79.  
  80.     cout << ans;
  81. }
  82.  
  83. int nex[N][N];
  84.  
  85. void Min(int &x, int y)
  86. {
  87.     if (x > y)
  88.         x = y;
  89. }
  90.  
  91. void Sub_3()
  92. {
  93.     for (int i = 1; i <= m; ++i)
  94.     {
  95.         for (int j = 1; j <= n; ++j)
  96.         {
  97.             if (a[i] == b[j])
  98.                 lcs[i][j] = lcs[i - 1][j - 1] + 1;
  99.             else
  100.                 lcs[i][j] = max(lcs[i - 1][j], lcs[i][j - 1]);
  101.         }
  102.     }
  103.  
  104.     fill_n(&f[0][0][0], 2 * N * N, n + 1);
  105.     fill_n(&nex[0][0], N * N, n + 1);
  106.  
  107.     for (int i = n; i; --i)
  108.     {
  109.         for (int j = 0; j <= 500; ++j)
  110.             nex[j][i] = nex[j][i + 1];
  111.         nex[b[i]][i] = i;
  112.     }
  113.  
  114.     f[0][0][0] = 0;
  115.  
  116.     for (int i = 1; i <= m; ++i)
  117.     {
  118.         int p = i & 1;
  119.         int np = !p;
  120.        
  121.         f[p][0][0] = nex[a[i]][1];
  122.  
  123.         for (int j = 1; j <= i; ++j)
  124.             for (int t = 0, maxn = n + 1; t <= 500; ++t)
  125.             {
  126.                 f[p][j][t] = n + 1;
  127.  
  128.                 if (f[np][j][t] != n + 1 && lcs[i][nex[a[i]][f[np][j][t] + 1]] == lcs[i - 1][f[np][j][t]] + 1)
  129.                     Min(f[p][j][t], nex[a[i]][f[np][j][t] + 1]);
  130.                 if (lcs[i][f[np][j][t]] == lcs[i - 1][f[np][j][t]])
  131.                     Min(f[p][j][t], f[np][j][t]);
  132.  
  133.                 if (j)
  134.                 {
  135.                     if (f[np][j - 1][t] != n + 1 && lcs[i][nex[a[i]][f[np][j - 1][t] + 1]] == lcs[i - 1][f[np][j - 1][t]] + 1 && t < a[i])
  136.                         maxn = min(maxn, nex[a[i]][f[np][j - 1][t] + 1]);
  137.                     else if (t == a[i])
  138.                         Min(f[p][j][t], maxn);
  139.                 }
  140.  
  141.                 if (f[p][j][t] != n + 1)
  142.                     cerr << i << " " << j << " " << t << ": " << f[p][j][t] << "\n";
  143.             }
  144.     }
  145.  
  146.     for (int i = m; ~i; --i)
  147.         for (int j = 500; ~j; --j)
  148.             if (f[m & 1][i][j] != n + 1)
  149.             {
  150.                 cout << i;
  151.                 return;
  152.             }
  153. }
  154.  
  155. int32_t main()
  156. {
  157.     ios_base::sync_with_stdio(0);
  158.     cin.tie(0);
  159.     cout.tie(0);
  160.  
  161.     if (fopen(task ".INP", "r"))
  162.     {
  163.         freopen(task ".INP", "r", stdin);
  164.         freopen(task ".OUT", "w", stdout);
  165.     }
  166.  
  167.     Read();
  168.  
  169.     if (m <= 500 && *max_element(a + 1, a + m + 1) <= 500 && *max_element(b + 1, b + n + 1) <= 500)
  170.     {
  171.         Sub_2();
  172.     }
  173. }
  174.  
  175. /*
  176. 15 20
  177. 8 4 4 9 4 8 7 9 4 9 3 1 7 3 5
  178. 8 8 8 4 5 4 6 4 5 6 3 7 1 3 2 9 1 9 9 4
  179.  
  180. 10 13
  181. 17 11 4 14 17 19 18 15 1 19
  182. 18 4 5 12 12 11 18 19 18 1 4 7 16
  183.  
  184. 268 212
  185. 8 7 9 2 1 7 9 3 6 5 3 7 7 5 1 8 3 3 6 3 3 3 1 6 8 4 2 4 8 4 1 5 7 1 8 8 9 2 10 2 3 6 9 1 10 9 5 4 1 10 10 1 10 7 7 6 1 5 4 8 7 10 3 10 5 5 6 6 9 1 10 8 4 3 7 1 6 7 7 1 8 7 2 2 9 3 7 8 7 7 8 4 2 3 6 3 7 8 7 1 3 3 4 7 8 7 3 10 1 8 10 3 5 2 3 4 9 10 7 8 1 5 3 10 7 7 4 3 6 5 7 9 1 8 7 6 9 9 10 10 10 4 7 6 5 5 8 7 2 5 8 1 9 9 10 8 2 1 4 8 2 5 5 2 6 2 3 10 8 4 2 7 6 10 2 10 10 10 5 10 8 1 2 6 6 10 5 7 4 6 2 10 8 1 6 1 4 8 3 3 2 4 2 8 4 1 7 8 8 3 1 8 5 2 6 2 8 8 10 6 8 3 10 7 6 3 5 4 10 7 3 6 7 4 3 4 9 2 5 4 6 10 5 10 9 1 8 10 6 8 5 6 5 3 6 5 6 4 5 2 7 6 10 10 9 9 1 6
  186. 7 8 2 3 1 8 8 4 8 2 2 7 7 10 9 10 9 5 1 9 7 1 10 7 4 10 1 10 6 4 3 3 2 4 6 9 4 5 1 8 9 4 7 4 7 6 1 10 10 3 6 5 8 2 4 7 8 2 1 2 1 2 4 8 1 4 8 4 2 7 9 4 7 3 8 7 2 8 1 7 7 3 4 7 8 4 2 1 5 7 9 1 5 10 3 2 4 10 10 8 1 6 10 4 8 7 7 3 2 8 10 9 3 6 8 5 3 9 8 9 6 2 3 2 8 5 2 6 9 8 10 3 8 10 8 7 3 9 3 5 5 5 8 10 3 9 2 5 2 1 1 9 1 8 9 3 7 10 10 4 9 8 10 3 4 5 9 10 6 2 4 3 7 8 9 7 1 3 1 8 4 3 7 4 5 1 4 2 10 4 9 8 9 7 4 3 4 7 6 7 2 1 5 8 8 5 10 1 2 1 6 9
  187. */
Add Comment
Please, Sign In to add comment