結果
問題 | No.753 最強王者決定戦 |
ユーザー | horiesiniti |
提出日時 | 2018-11-14 18:25:25 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 64 ms / 1,000 ms |
コード長 | 1,825 bytes |
コンパイル時間 | 727 ms |
コンパイル使用メモリ | 74,012 KB |
実行使用メモリ | 12,416 KB |
最終ジャッジ日時 | 2024-06-06 20:01:21 |
合計ジャッジ時間 | 1,445 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 62 ms
12,416 KB |
testcase_01 | AC | 62 ms
12,416 KB |
testcase_02 | AC | 64 ms
12,288 KB |
testcase_03 | AC | 63 ms
12,416 KB |
ソースコード
#include <iostream> using namespace std; #include<stdio.h> #include<algorithm> #include<vector> #include<string.h> int data[17][17]; const int LIMIT=16; long long int dp[17][16]; long long int ms[70000][16]; int isV(int p1,int p2){ if(p1>p2){ std::swap(p1,p2); } if(data[p1][p2]==1)return p1; return p2; } void f(int p,std::vector<int>& all,std::vector<int>& Ls,std::vector<int>& Rs){ int s=all.size(); int s2=s/2; if(s==4&&p==0){ int perm1=(1<<all[0])|(1<<all[1])|(1<<all[2])|(1<<all[3]); if(ms[perm1][all[0]]!=-1){ for(int i=0;i<4;i++){ dp[s][all[i]]+=ms[perm1][all[i]]; } return ; } } if((s==2)||(s==Ls.size()+Rs.size())){ if(s==2){ dp[s][isV(all[0],all[1])]+=2; }else{ int x=s/2; for(int j=0;j<LIMIT;j++){ dp[x][j]=0; } std::vector<int> Ls2,Rs2; f(0,Ls,Ls2,Rs2); f(0,Rs,Ls2,Rs2); int perm1=-1; if(s==4){ perm1=(1<<all[0])|(1<<all[1])|(1<<all[2])|(1<<all[3]); if(ms[perm1][all[0]]==-1){ for(int i=0;i<4;i++){ ms[perm1][all[i]]=0; } } } for(int i=0;i<Ls.size();i++){ for(int j=0;j<Rs.size();j++){ int no1=Ls[i]; int no2=Rs[j]; int no3=isV(no1,no2); dp[s][no3]+=(dp[s2][no1]*dp[s2][no2])*2; if(perm1!=-1){ ms[perm1][no3]+=(dp[s2][no1]*dp[s2][no2])*2; } } } } }else{ if(Ls.size()<s2){ Ls.push_back(all[p]); f(p+1,all,Ls,Rs); Ls.pop_back(); } if((p>0)&&(Rs.size()<s2)){ Rs.push_back(all[p]); f(p+1,all,Ls,Rs); Rs.pop_back(); } } } int main(){ std::vector<int> all,Ls,Rs; memset(dp,0,sizeof(dp)); memset(ms,-1,sizeof(ms)); for(int i=0;i<LIMIT;i++){ for(int j=0;j<LIMIT;j++){ scanf("%d",&data[i][j]); } all.push_back(i); } f(0,all,Ls,Rs); for(int i=0;i<LIMIT;i++){ std::cout<<dp[LIMIT][i]<<"\n"; } }