Submission #1216686

#TimeUsernameProblemLanguageResultExecution timeMemory
1216686duckindog매우 즐거운 카드 게임 (JOI15_cardgame2)C++20
100 / 100
53 ms4424 KiB
#include <bits/stdc++.h> using namespace std; const int N = 500 + 10; int n; int c[N], a[N], v[N]; long long pref[N]; long long f[N][N][2]; inline void getMax(auto& x, const auto& y) { x = max(x, y); } int32_t main() { cin.tie(0)->sync_with_stdio(0); cin >> n; for (int i = 1; i <= n; ++i) cin >> c[i] >> a[i] >> v[i]; for (int i = 1; i <= n + 1; ++i) pref[i] = pref[i - 1] + v[i]; auto sum = [&](int l, int r) { return pref[r] - pref[l - 1]; }; auto chk = [&](int i, int j) { return c[i] == c[j] || a[i] == a[j]; }; long long answer = 0; memset(f, -14, sizeof f); f[1][2][0] = f[1][2][1] = 0; for (int i = 1; i <= n; ++i) { for (int j = i + 1; j <= n + 1; ++j) { for (int type = 0; type <= 1; ++type) { const auto& cur = f[i][j][type]; if (!type) { long long value = cur + sum(i, i); getMax(answer, value); if (chk(i, j)) getMax(f[j][j + 1][0], value); if (chk(i, j + 2)) getMax(f[j][j + 1][1], value); } else { for (int k = j + 1; k <= n; ++k) { long long value = cur + sum(j + 1, k); answer = max(answer, value); if (chk(i, k)) { long long value1 = value + sum(i, i); answer = max(answer, value1); if (chk(i, j)) getMax(f[j][k + 1][0], value1); if (chk(i, k + 2)) getMax(f[j][k + 1][1], value1); } if (!chk(k, k + 1)) break; } } } } } cout << answer << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...