結果
問題 | No.753 最強王者決定戦 |
ユーザー | yuppe19 😺 |
提出日時 | 2019-07-05 20:24:16 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 331 ms / 1,000 ms |
コード長 | 1,308 bytes |
コンパイル時間 | 811 ms |
コンパイル使用メモリ | 78,976 KB |
実行使用メモリ | 12,160 KB |
最終ジャッジ日時 | 2024-09-22 05:31:40 |
合計ジャッジ時間 | 2,869 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 329 ms
12,160 KB |
testcase_01 | AC | 330 ms
12,160 KB |
testcase_02 | AC | 328 ms
12,160 KB |
testcase_03 | AC | 331 ms
12,160 KB |
ソースコード
#include <iostream> #include <vector> using namespace std; using i64 = int64_t; int main(void) { constexpr int N = 16; vector<int> p2(10); p2[0] = 1; for(int i=0; i<9; ++i) { p2[i+1] = p2[i] * 2; } vector<vector<bool>> G(N, vector<bool>(N, false)); for(int j=0; j<N; ++j) { for(int i=0; i<N; ++i) { int x; scanf("%d", &x); switch(x) { case 1: G[j][i] = true; break; case -1: G[i][j] = true; break; } } } // dp[勝者][この集合で試合をする] := パターン数 vector<vector<i64>> dp(N, vector<i64>(1<<N, 0)); for(int v=0; v<N; ++v) { dp[v][1<<v] = 1; } for(int i=0; i<4; ++i) { for(int S0=0; S0<1<<N; ++S0) { if(__builtin_popcount(S0) != p2[i+1]) { continue; } for(int T0=S0; T0; T0=--T0 & S0) { if(__builtin_popcount(T0) != p2[i]) { continue; } int T1 = S0 & ~T0; for(int u=0; u<N; ++u) { if(!(T0 >> u & 1)) { continue; } for(int v=0; v<N; ++v) { if(!(T1 >> v & 1)) { continue; } if(G[u][v]) { dp[u][S0] += dp[u][T0] * dp[v][T1]; } } } } } } for(int v=0; v<N; ++v) { i64 res = dp[v][(1<<N)-1] << (N-1); printf("%ld\n", res); } return 0; }