【Gym100837F】Controlled Tournament(状压Dp 搜索剪枝)
大意
现有\(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 搜索剪枝)的更多相关文章
- bzoj 2669 题解(状压dp+搜索+容斥原理)
这题太难了...看了30篇题解才整明白到底咋回事... 核心思想:状压dp+搜索+容斥 首先我们分析一下,对于一个4*7的棋盘,低点的个数至多只有8个(可以数一数) 这样的话,我们可以进行一个状压,把 ...
- Educational Codeforces Round 13 E. Another Sith Tournament 状压dp
E. Another Sith Tournament 题目连接: http://www.codeforces.com/contest/678/problem/E Description The rul ...
- Codeforces 678E Another Sith Tournament 状压DP
题意: 有\(n(n \leq 18)\)个人打擂台赛,编号从\(1\)到\(n\),主角是\(1\)号. 一开始主角先选一个擂主,和一个打擂的人. 两个人之中胜的人留下来当擂主等主角决定下一个人打擂 ...
- 【题解】P3959 宝藏 - 状压dp / dfs剪枝
P3959 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝 ...
- 「状压DP」「暴力搜索」排列perm
「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...
- NOIP2017宝藏 [搜索/状压dp]
NOIP2017 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘 ...
- [JZOJ5398]:Adore(状压DP+记忆化搜索)
题目描述 小$w$偶然间见到了一个$DAG$. 这个$DAG$有$m$层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有$k$个节点. 现在小$w$每次可以取反第$i(1<i< ...
- 相邻行列相互影响的状态类问题(类似状压dp的搜索)(POJ3279)
POJ3279http://poj.org/problem?id=3279 题意:黑白的板,每次选择一个十字形翻转(十字板内黑白互换,若是边界则不管),求最小将原图变为全白的策略. 这是一道对于每个格 ...
- NOIp2017D2T2(luogu3959) 宝藏 (状压dp)
时隔多年终于把这道题锅过了 数据范围显然用搜索剪枝状压dp. 可以记还有哪些点没到(或者已到了哪些点).我们最深已到的是哪些点.这些点的深度是多少,然后一层一层地往下推. 但其实是没必要记最深的那一层 ...
随机推荐
- 抛弃go-micro,使用极简微服务框架Bull
简介 Bull是一款基于GO语言的极简微服务框架. 使用GRPC作为RPC协议,使用ETCD作为注册中心. 框架目前已经实现了服务注册.服务发现(客户端轮训)功能. 整体架构 代码地址 https:/ ...
- 分区命令(大于2TB的分区)
注意:parted命令在恢复误删除的分区时候,容易失败的几点: (1)只划分一个分区.恢复失败 (2)划分了2个分区,但是没有格式化.直接删除一个分区,恢复也会失败. (3)做删除操作时候,如果同时删 ...
- html基础 button按钮标签
场景:在网页中显示用户点击的按钮标签名:button 注意:form不能少,少了不会出效果 html代码 <form > 昵称: <input type="text&quo ...
- Python基础之pytest参数化
上篇博文介绍过,pytest是目前比较成熟功能齐全的测试框架,使用率肯定也不断攀升.在实际 工作中,许多测试用例都是类似的重复,一个个写最后代码会显得很冗余.这里,我们来了解一下 @pytest.ma ...
- 设置Linux的一些文本输出方式
更新一下yum咯 yum install -y epel-release 火车 sudo yum install sl $ sl 放火 sudo yum install libaa-bin 小老鼠 s ...
- sqlserver - 查出的结果集,集成为json串放在一个字段里
1.效果 2.sql SELECT top 20 (select [name] as [名字] from staffBasicInfo For JSON PATH,ROOT('第一级key')) k ...
- SYCOJ1613递归函数
题目-递归函数 (shiyancang.cn) 记忆化dfs,注意dp的限制范围 #include<bits/stdc++.h> using namespace std; const in ...
- What's The Next|Kube-OVN 社区线上 Meetup 预告!
Kube-OVN 社区线上Meetup 直播预约通道已开启! 活动时间 2021年8月26日(周四)19:00-20:30 活动介绍 8月26日,Kube-OVN 社区 Meetup 将通过线 ...
- 【刷题-LeetCode】166 Fraction to Recurring Decimal
Fraction to Recurring Decimal Given two integers representing the numerator and denominator of a fra ...
- Django db使用MySQL连接池
Django db使用MySQL连接池 Sep 25 2016 Django db模块本身不支持MySQL连接池,只有一个配置CONN_MAX_AGE连接最大存活时间,如果WSGI服务器使用了线程池技 ...