csu 1964(状压DP)
2017-07-24 19:55
323 查看
题意是n名球员进行淘汰赛,通过抽签决定比赛对手。假设任意两名球员之间的胜负关系是固定的,问有多少种抽签结果使得最后一名球员获得冠军。注意1号球员和2号球员不能在同一个半区。其中n是2的幂。
这是一道状压动态规划题。用表示能从集合中的球员中获胜的方案数。其中s集合中的球员人数是2的幂。
转移方程为
dp[s][i]=2∗∑dp[s1][i]∗dp[s2][j],(icandefeatj)
考虑将分成两个大小相等的子集s1,s2,dp[s1][i]表示i从自己所属子集胜出的方案数,dp[s2][j]表示从另一子集胜出的方案数,且能打败,二者相乘就是能从集合获胜的方案数。考虑到上下半区的顺序,不要忘了乘以2。
最终答案是dp[2n−1][n]。
这是一道状压动态规划题。用表示能从集合中的球员中获胜的方案数。其中s集合中的球员人数是2的幂。
转移方程为
dp[s][i]=2∗∑dp[s1][i]∗dp[s2][j],(icandefeatj)
考虑将分成两个大小相等的子集s1,s2,dp[s1][i]表示i从自己所属子集胜出的方案数,dp[s2][j]表示从另一子集胜出的方案数,且能打败,二者相乘就是能从集合获胜的方案数。考虑到上下半区的顺序,不要忘了乘以2。
最终答案是dp[2n−1][n]。
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; #define N 16 typedef long long ll; ll dp[1<<N] ; vector<int> bits[1<<N]; int bit[1<<N]; bool g ; void init() { for(int i=0;i<(1<<N);++i) { for(int j=0;j<N;++j) if((i>>j)&1) { ++bit[i]; bits[i].push_back(j); } } } void solve(int n) { int x,y,s1,s2; memset(dp,0,sizeof(dp)); for(int i=0;i<n;++i) dp[1<<i][i]=1; for(int s=1;s<(1<<n);++s) { if(bit[s]==1||bit[bit[s]]!=1) continue; if(s!=(1<<n)-1&&(s&1)&&(s&2)) continue; for(int ss=s;ss;ss=(ss-1)&s) { if((bit[ss]<<1)!=bit[s]) continue; s1=ss,s2=s-ss; for(int i=0;i<bits[s1].size();++i) { x=bits[s1][i]; if(dp[s1][x]==0) continue; for(int j=0;j<bits[s2].size();++j) { y=bits[s2][j]; if(dp[s2][y]==0) continue; if(g[x][y]) dp[s][x]+=dp[s1][x]*dp[s2][y]; else dp[s][y]+=dp[s1][x]*dp[s2][y]; } } } } } int main() { init(); int ca,n; scanf("%d",&ca); for(int caa=1;caa<=ca;++caa) { char st[N+10]; scanf("%d",&n); for(int i=0;i<n;++i) { scanf("%s",st); for(int j=0;j<n;++j) g[i][j]=st[j]-'0'; } solve(n); printf("Case #%d: %lld\n",caa,dp[(1<<n)-1][n-1]); } return 0; }
相关文章推荐
- CSU-1964 Problem_hc(状压dp)
- CSU1129 送货到家 状压dp
- CSU 1964 Problem_hc(状态压缩dp)
- bzoj 4145(状压dp)
- Codeforces Round #321 (Div. 2) D. Kefa and Dishes 状压dp
- codevs1358棋盘游戏(状压dp)
- poj2411_Mondriaan's Dream_状压DP(插头)
- CSU1022-菜鸟和大牛-简单DP
- poj 3254 Corn Fields(状压DP入门)
- UVa 12507 - Kingdoms(状压dp)
- [UOJ129][BZOJ4197][NOI2015]寿司晚宴(状压DP)
- POJ 2686 Traveling by Stagecoach(状压DP)
- Codeforces Gym 100676G Training Camp 状压dp
- DP进阶(1)、状压DP
- HDU5816 Hearthstone(状压DP)
- BZOJ1087: [SCOI2005]互不侵犯King 题解【DP】【状压】
- LightOJ - 1037 Agent 47(状压DP)
- hdu5816 状压dp
- UVA Live Archive 4490 Help Bubu(状压dp)
- UVA 10911 Forming Quiz Teams(状压DP)