結果
| 問題 |
No.1045 直方体大学
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-05-01 21:59:12 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 364 ms / 2,000 ms |
| コード長 | 1,655 bytes |
| コンパイル時間 | 840 ms |
| コンパイル使用メモリ | 80,148 KB |
| 最終ジャッジ日時 | 2025-01-10 04:46:47 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 17 |
ソースコード
#include <iostream>
#include <vector>
template <class T>
std::vector<T> vec(int len, T elem) { return std::vector<T>(len, elem); }
void solve() {
int n;
std::cin >> n;
auto ps = vec(n, vec(3, 0));
for (auto& p : ps) {
for (auto& x : p) {
std::cin >> x;
}
}
auto judge = [&](int ai, int aj, int bi, int bj) {
int ax = ps[ai][(aj + 1) % 3], ay = ps[ai][(aj + 2) % 3];
int bx = ps[bi][(bj + 1) % 3], by = ps[bi][(bj + 2) % 3];
if (ax > ay) std::swap(ax, ay);
if (bx > by) std::swap(bx, by);
return bx <= ax && by <= ay;
};
auto dp = vec(1 << n, vec(n, vec(3, -1)));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < 3; ++j) {
dp[1 << i][i][j] = ps[i][j];
}
}
int ans = 0;
for (int b = 0; b < (1 << n); ++b) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < 3; ++j) {
if (dp[b][i][j] == -1) continue;
ans = std::max(ans, dp[b][i][j]);
for (int ni = 0; ni < n; ++ni) {
if ((b >> ni) & 1) continue;
int nb = b | (1 << ni);
for (int nj = 0; nj < 3; ++nj) {
if (!judge(i, j, ni, nj)) continue;
dp[nb][ni][nj] = std::max(dp[nb][ni][nj],
dp[b][i][j] + ps[ni][nj]);
}
}
}
}
}
std::cout << ans << std::endl;
}
int main() {
std::cin.tie(nullptr);
std::ios::sync_with_stdio(false);
solve();
return 0;
}