Advertisement
Tarche

romperonda-tarche

May 21st, 2021 (edited)
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int MOD = 16;
  6. const int INF = 1e9;
  7.  
  8. int solveFirst(const vector<int>& ronda, int m) {
  9.     int n = (int)ronda.size();
  10.  
  11.     int ans = -INF;
  12.     for (int c = 0; c < MOD; c++) {
  13.         vector<vector<vector<int>>> dp(n, vector<vector<int>>(m + 1, vector<int>(MOD, -INF)));
  14.         dp[0][0][(c + ronda[0]) % MOD] = 0;
  15.  
  16.         for (int i = 0; i < n - 1; i++) {
  17.             for (int j = 0; j <= m; j++) {
  18.                 for (int k = 0; k < MOD; k++) {
  19.                     int a = (k + ronda[i + 1]) % MOD;
  20.                     int b = ronda[i + 1];
  21.                     dp[i + 1][j][a] = max(dp[i + 1][j][a], dp[i][j][k]);
  22.                     if (j < m)
  23.                         dp[i + 1][j + 1][b] = max(dp[i + 1][j + 1][b], dp[i][j][k] + k * k);
  24.                 }
  25.             }
  26.         }
  27.  
  28.         if (c == 0) {
  29.             for (int i = 0; i < MOD; i++) {
  30.                 ans = max(ans, dp[n - 1][m - 1][i] + i * i);
  31.             }
  32.         } else {
  33.             ans = max(ans, dp[n - 1][m][c]);
  34.         }
  35.     }
  36.  
  37.     return ans;
  38. }
  39.  
  40. int solveSecond(const vector<int>& ronda, int m) {
  41.     int n = (int)ronda.size();
  42.     vector<vector<vector<int>>> dp(n, vector<vector<int>>(m, vector<int>(MOD, -INF)));
  43.  
  44.     dp[1][1][ronda[1]] = ronda[0] * ronda[0];
  45.  
  46.     for (int i = 1; i < n - 1; i++) {
  47.         for (int j = 1; j < m; j++) {
  48.             for (int k = 0; k < MOD; k++) {
  49.                 int a = (k + ronda[i + 1]) % MOD;
  50.                 int b = ronda[i + 1];
  51.                 dp[i + 1][j][a] = max(dp[i + 1][j][a], dp[i][j][k]);
  52.                 if (j < m - 1)
  53.                     dp[i + 1][j + 1][b] = max(dp[i + 1][j + 1][b], dp[i][j][k] + k * k);
  54.             }
  55.         }
  56.     }
  57.  
  58.     int ans = -INF;
  59.     for (int k = 0; k < MOD; k++) {
  60.         ans = max(ans, dp[n - 1][m - 1][k] + k * k);
  61.     }
  62.     return ans;
  63. }
  64.  
  65. vector<int> romperonda(vector<int>& ronda, int k) {
  66.     int n = (int)ronda.size();
  67.     for (int i = 0; i < n; i++) {
  68.         ronda[i] %= MOD;
  69.     }
  70.  
  71.     return {solveFirst(ronda, k), solveSecond(ronda, k)};
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement