Advertisement
mickypinata

TOI16: Carte

Oct 5th, 2021
769
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.28 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef pair<int, int> pii;
  5.  
  6. const int N = 400;
  7.  
  8. int arr[N + 1];
  9. pii dp[N + 1][N + 1];
  10.  
  11. int main(){
  12.  
  13.     int Q, limDish;
  14.     scanf("%d%d", &Q, &limDish);
  15.     int ans = 0;
  16.     for(int l = 1; l <= N; ++l){
  17.         dp[l][l] = pii(1, 1);
  18.     }
  19.     while(Q--){
  20.         int n;
  21.         scanf("%d", &n);
  22.         for(int i = 1; i <= n; ++i){
  23.             scanf("%d", &arr[i]);
  24.         }
  25.         for(int d = 2; d <= n; ++d){
  26.             for(int l = 1; l <= n - d + 1; ++l){
  27.                 int r = l + d - 1;
  28.                 pii mn = pii(dp[l + 1][r].first + 1, 1);
  29.                 for(int i = l + 1; i <= r; ++i){
  30.                     if(arr[l] == arr[i]){
  31.                         pii newAns;
  32.                         if(dp[i][r].second == limDish){
  33.                             newAns = pii(dp[l + 1][i - 1].first + dp[i][r].first + 1, 1);
  34.                         } else {
  35.                             newAns = pii(dp[l + 1][i - 1].first + dp[i][r].first, dp[i][r].second + 1);
  36.                         }
  37.                         mn = min(mn, newAns);
  38.                     }
  39.                 }
  40.                 dp[l][r] = mn;
  41.             }
  42.         }
  43.         ans = max(ans, dp[1][n].first);
  44.     }
  45.     cout << ans;
  46.  
  47.     return 0;
  48. }
  49.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement