結果

問題 No.753 最強王者決定戦
ユーザー beetbeet
提出日時 2018-11-09 21:46:08
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 383 ms / 1,000 ms
コード長 1,213 bytes
コンパイル時間 1,963 ms
コンパイル使用メモリ 205,776 KB
実行使用メモリ 12,220 KB
最終ジャッジ日時 2024-11-21 05:48:31
合計ジャッジ時間 4,266 ms
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 363 ms
12,196 KB
testcase_01 AC 371 ms
12,216 KB
testcase_02 AC 381 ms
12,136 KB
testcase_03 AC 383 ms
12,220 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
using namespace std;
using Int = long long;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}

//INSERT ABOVE HERE
const Int n = 16;
Int dp[n][1<<n];
Int a[n][n];
Int bc[1<<n];

void dfs(Int b){
  if(~dp[0][b]) return;
  for(Int i=0;i<n;i++)
    dp[i][b]=0;
  
  if(bc[b]==1){
    for(int i=0;i<n;i++)
      if((b>>i)&1) dp[i][b]=1;
    return;
  }

  for(Int nb=b;nb;nb=b&(nb-1)){
    if(bc[nb]!=bc[b^nb]) continue;
    vector<Int> x,y;
    for(Int i=0;i<n;i++){
      if((nb>>i)&1) x.emplace_back(i);
      if(((b^nb)>>i)&1) y.emplace_back(i);
    }
    dfs(nb);
    dfs(b^nb);
    for(Int i:x){
      for(Int j:y){
        if(a[i][j]>0) dp[i][b]+=dp[i][nb]*dp[j][b^nb];
        if(a[i][j]<0) dp[j][b]+=dp[i][nb]*dp[j][b^nb];
      }
    }
  }
}

signed main(){
  memset(dp,-1,sizeof(dp));
  for(Int i=0;i<n;i++)
    for(Int j=0;j<n;j++) cin>>a[i][j];

  for(Int i=0;i<(1<<n);i++)
    bc[i]=__builtin_popcount(i);
  
  for(Int i=0;i<n;i++)
    for(Int j=i;j<n;j++)
      a[j][i]=-a[i][j];
  
  dfs((1<<n)-1);
  for(Int i=0;i<n;i++)
    cout<<dp[i][(1<<n)-1]<<endl;  
  return 0;
}
0