题目链接

大意

现有\(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. SpringBoot 之 实现登录功能及登录拦截器

    增加登录退出控制器: # src/main/java/com/wu/controller/LoginController.java @Controller public class LoginCont ...

  2. org.reflections 接口通过反射获取实现类源码研究

    org.reflections 接口通过反射获取实现类源码研究 版本 org.reflections reflections 0.9.12 Reflections通过扫描classpath,索引元数据 ...

  3. IE播放音频踩坑之路---待修改

    在其他浏览器都是兼容的!在IE9就是显示一个黑色的框上面有个X 音乐无法播放   要显示播放界面的话,要添加 controls 属性(控件属性)例子:<audio src="xxx.m ...

  4. class、抽象类、接口区别

    Java 抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 由于抽象类不 ...

  5. 使用HTMLTestRunner在目标目录下并未生成HTML文件解决办法

    使用pycharm工具应用HTMLTestRunner模块时,测试用例可以顺利运行,但在目标目录下并未生成HTML文件.使用python的IDLE,能够正常运行并创建写入测试结果. 测试环境:pyth ...

  6. 微信小程序-国际化(miniprogram-i18n)

    前情提要 最近维护了一个微信小程序的老项目,维护的其中一项是添加国际化.由于踩了蛮多坑,所以就有了这篇文档!!! miniprogram-i18n 对除小程序外的其他框架开发做过国际化的朋友来说i18 ...

  7. List子接口

    简介 特点: 有序, 有下标, 元素可以重复 常用方法 boolean add(E e) 将指定的元素追加到此列表的末尾(可选操作). void add(int index, E element) 将 ...

  8. React教程

    教程 一.demo <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> &l ...

  9. gin框架中的同步异步

    goroutine机制可以方便地实现异步处理 另外,在启动新的goroutine时,不应该使用原始上下文,必须使用它的只读副本 // 异步 func longAsync(context *gin.Co ...

  10. alpakka-kafka(9)-kafka在分布式运算中的应用

    kafka具备的分布式.高吞吐.高可用特性,以及所提供的各种消息消费模式可以保证在一个多节点集群环境里消息被消费的安全性:即防止每条消息遗漏处理或重复消费.特别是exactly-once消费策略:可以 ...