题目链接

大意

现有\(N\)个人要打比赛,知道任意两个人间打比赛的胜负关系。

要求在 深度最小 的情况下,根为\(M\)的 竞赛树 的个数。



满足\(1\le M\le N\le 16\)

思路

虑及\(N\)如此之小的范围,不是状压就是暴搜。

考虑状态\(Dp[s][u][d]\)表示在以点集\(s\)组成子树,\(u\)为根,深度不超过\(d\)的方案数。

那么转移就为\(Dp[s][u][d]=Dp[s'][u][d]+Dp[s-s'][v][d]\).其中\(u\)能击败\(v\)。

然而,这样做的复杂度是\(O(3^N\times N^2)\),考虑变成记忆化搜索省掉无用状态。

考虑题目中给出的深度最小的条件,那么这棵树的深度一定是\(\left \lceil log2(N) \right \rceil\),那么它的两棵子树深度一定都不会超过\(\left \lceil log2(N)-1 \right \rceil\)。

所以记搜时,对深度不符合的子树剪枝就行了,这样的话,搜索深度肯定就只能在\(\left \lceil log2(N) \right \rceil\)以内,就可以过了。

代码

要用Freopen

#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=17;
int N,M,A[MAXN][MAXN];
int vis[MAXN],Q[MAXN],Len;
int Cnt[1<<MAXN],H[MAXN];
vector<int>P[MAXN];
long long Dp[1<<(MAXN-1)][MAXN][MAXN>>1];
int lowbit(int x){return x&(-x);}
long long DFS(int S,int rt,int dep){
if(Dp[S][rt][dep]!=-1)return Dp[S][rt][dep];
long long &ret=(Dp[S][rt][dep]=0);
if(Cnt[S]==1){
if(S&(1<<(rt-1)))return ret=1;
return ret=0;
}
for(int x=S&(S-1);x;x=S&(x-1)){//其实对于枚举子集可以优化.
int y=S-x;
if(!(x&(1<<(rt-1))))continue;
if(H[Cnt[x]]>dep-1)continue;
if(H[Cnt[y]]>dep-1)continue;
long long Ans1=0,Ans2=0;
Ans1=DFS(x,rt,dep-1);
int size=P[rt].size();
for(int i=0;i<size;i++){
int v=P[rt][i];
if(!(y&(1<<(v-1))))continue;
Ans2+=DFS(y,v,dep-1);
}
ret+=Ans1*Ans2;
}
return ret;
}
int main(){
//freopen("f.in","r",stdin);
//freopen("f.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++){
scanf("%d",&A[i][j]);
if(A[i][j])P[i].push_back(j);
}
for(int i=1;i<=N;i++)H[i]=ceil(log2(i));
for(int i=1;i<(1<<N);i++)
Cnt[i]=Cnt[i>>1]+(i&1);
memset(Dp,-1,sizeof(Dp));
printf("%lld\n",DFS((1<<N)-1,M,H[N]));
}

【Gym100837F】Controlled Tournament(状压Dp 搜索剪枝)的更多相关文章

  1. bzoj 2669 题解(状压dp+搜索+容斥原理)

    这题太难了...看了30篇题解才整明白到底咋回事... 核心思想:状压dp+搜索+容斥 首先我们分析一下,对于一个4*7的棋盘,低点的个数至多只有8个(可以数一数) 这样的话,我们可以进行一个状压,把 ...

  2. Educational Codeforces Round 13 E. Another Sith Tournament 状压dp

    E. Another Sith Tournament 题目连接: http://www.codeforces.com/contest/678/problem/E Description The rul ...

  3. Codeforces 678E Another Sith Tournament 状压DP

    题意: 有\(n(n \leq 18)\)个人打擂台赛,编号从\(1\)到\(n\),主角是\(1\)号. 一开始主角先选一个擂主,和一个打擂的人. 两个人之中胜的人留下来当擂主等主角决定下一个人打擂 ...

  4. 【题解】P3959 宝藏 - 状压dp / dfs剪枝

    P3959 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的m  条道路和它们的长度. 小明决心亲自前往挖掘所有宝 ...

  5. 「状压DP」「暴力搜索」排列perm

    「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...

  6. NOIP2017宝藏 [搜索/状压dp]

    NOIP2017 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘 ...

  7. [JZOJ5398]:Adore(状压DP+记忆化搜索)

    题目描述 小$w$偶然间见到了一个$DAG$. 这个$DAG$有$m$层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有$k$个节点. 现在小$w$每次可以取反第$i(1<i< ...

  8. 相邻行列相互影响的状态类问题(类似状压dp的搜索)(POJ3279)

    POJ3279http://poj.org/problem?id=3279 题意:黑白的板,每次选择一个十字形翻转(十字板内黑白互换,若是边界则不管),求最小将原图变为全白的策略. 这是一道对于每个格 ...

  9. NOIp2017D2T2(luogu3959) 宝藏 (状压dp)

    时隔多年终于把这道题锅过了 数据范围显然用搜索剪枝状压dp. 可以记还有哪些点没到(或者已到了哪些点).我们最深已到的是哪些点.这些点的深度是多少,然后一层一层地往下推. 但其实是没必要记最深的那一层 ...

随机推荐

  1. 抛弃go-micro,使用极简微服务框架Bull

    简介 Bull是一款基于GO语言的极简微服务框架. 使用GRPC作为RPC协议,使用ETCD作为注册中心. 框架目前已经实现了服务注册.服务发现(客户端轮训)功能. 整体架构 代码地址 https:/ ...

  2. 分区命令(大于2TB的分区)

    注意:parted命令在恢复误删除的分区时候,容易失败的几点: (1)只划分一个分区.恢复失败 (2)划分了2个分区,但是没有格式化.直接删除一个分区,恢复也会失败. (3)做删除操作时候,如果同时删 ...

  3. html基础 button按钮标签

    场景:在网页中显示用户点击的按钮标签名:button 注意:form不能少,少了不会出效果 html代码 <form > 昵称: <input type="text&quo ...

  4. Python基础之pytest参数化

    上篇博文介绍过,pytest是目前比较成熟功能齐全的测试框架,使用率肯定也不断攀升.在实际 工作中,许多测试用例都是类似的重复,一个个写最后代码会显得很冗余.这里,我们来了解一下 @pytest.ma ...

  5. 设置Linux的一些文本输出方式

    更新一下yum咯 yum install -y epel-release 火车 sudo yum install sl $ sl 放火 sudo yum install libaa-bin 小老鼠 s ...

  6. sqlserver - 查出的结果集,集成为json串放在一个字段里

    1.效果 2.sql SELECT top 20 (select [name] as [名字] from staffBasicInfo For JSON PATH,ROOT('第一级key')) k ...

  7. SYCOJ1613递归函数

    题目-递归函数 (shiyancang.cn) 记忆化dfs,注意dp的限制范围 #include<bits/stdc++.h> using namespace std; const in ...

  8. What's The Next|Kube-OVN 社区线上 Meetup 预告!

    ​ ​ Kube-OVN 社区线上Meetup 直播预约通道已开启! 活动时间 2021年8月26日(周四)19:00-20:30 活动介绍 8月26日,Kube-OVN 社区 Meetup 将通过线 ...

  9. 【刷题-LeetCode】166 Fraction to Recurring Decimal

    Fraction to Recurring Decimal Given two integers representing the numerator and denominator of a fra ...

  10. Django db使用MySQL连接池

    Django db使用MySQL连接池 Sep 25 2016 Django db模块本身不支持MySQL连接池,只有一个配置CONN_MAX_AGE连接最大存活时间,如果WSGI服务器使用了线程池技 ...