Jzoj5230 队伍统计
来源:互联网 发布:echart 引入json地图 编辑:程序博客网 时间:2024/04/27 22:35
现在有n个人要排成一列,编号为1->n 。但由于一些不明原因的关系,人与人之间可能存在一些矛盾关系,具体有m条矛盾关系(u,v),表示编号为u的人想要排在编号为v的人前面。要使得队伍和谐,最多不能违背k条矛盾关系(即不能有超过k条矛盾关系(u,v),满足最后v排在了u前面)。问有多少合法的排列。答案对10^9+7取模。
对应100%的数据,n,k<=20,m<=n*(n-1),保证矛盾关系不重复。
发现数据很小,可以用状压dp
我们设f[S][i]表示已经有i对矛盾关系,已经被选的集合为S的方案数
那么显然转移可以用bitset预处理一下
让后就可以卡过去
#include<stdio.h>#include<time.h>#include<bitset>#define M 1000000007using namespace std;int f[1<<20][21],ans=0;int n,m,k;bitset<21> s[21],p;inline void add(int& x,int y){ x=(x+y)%M; }int main(){freopen("count.in","r",stdin);freopen("count.out","w",stdout);scanf("%d%d%d",&n,&m,&k);for(int x,y,i=0;i<m;++i){scanf("%d%d",&x,&y);s[--x][--y]=1;}f[0][0]=1;for(int S=0;S<(1<<n);++S){for(int i=0;i<=k;++i)if(f[S][i]) for(int j=0;j<n;++j)if(~S&(1<<j)){p=S;int t=(s[j]&p).count();if(i+t<=k) add(f[S|(1<<j)][i+t],f[S][i]);}}for(int i=0;i<=k;++i) add(ans,f[(1<<n)-1][i]);printf("%d\n",ans);}
阅读全文
0 0
- Jzoj5230 队伍统计
- JZOJ5230. 【NOIP2017模拟A组模拟8.5】队伍统计
- 【状压DP】【cofun1895】队伍统计
- JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计
- JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计
- 5230. 【NOIP2017模拟A组模拟8.5】队伍统计
- 队伍分组统计 (双重循环遍历出来)或 (sql语句查出来
- 2017年8月18日提高组T2 队伍统计
- 队伍系统分析
- 加入队伍
- 如何构建测试队伍?
- 跟上队伍的步伐~
- 如何构建测试队伍?
- 如何构建测试队伍?
- 人月神话-外科手术队伍
- n支队伍比赛
- n支队伍比赛
- 队伍不好带
- Publish Flask on IIS
- Math 类中一些常用的数学运算
- HTML5和CSS3基础综合版
- System类源码分析
- 记录
- Jzoj5230 队伍统计
- LINUX中的运行级别
- c++程序书写规范----接口与实现的分离
- Macbook pro下面安装Apcahe Tomcat
- 火车票购票系统模拟
- 设计模式C++实现(1)——工厂模式
- springboot系列(二):Apache Shiro安全框架的简单使用
- display:block、inline、inline-block
- ROS小车底盘3-电机控制