一本通 高手训练 1781 死亡之树 状态压缩dp
LINK:死亡之树
关于去重 还是有讲究的。
题目求本质不同的 具有k个叶子节点的树的个数 不能上矩阵树。
点数很少容易想到装压dp 考虑如何刻画树的形状 发现一个维度做不了 所以。
设状态 f[i][j]表示 点的集合为i叶子集合的点为j的方案树。
这样我们就能知道这棵树大致的样子 空间 为\(2^{2n}\)
当然 如果使用三进制状压 空间复杂度还会进一步降到3^n 不过这道题没有卡空间。
考虑转移 可以枚举点 也可以枚举边。
先考虑枚举边 会出现重复的情况 如先加这条边再加那条边 两条边可以交换。
考虑强制按顺序的话 需要记上次加入的边是什么。时间上过不了。
考虑最后除以(n-1)! 这样也不行因为 这样的话 每次考虑加入边的时候点的状态的刻画存在问题。
考虑枚举点 此时实质还是在加边 还是有重复的。
甚至在某个时刻都有可能出现顺序带来方案数不同的问题。
还是考虑点的有序性 考虑 从一个状态到达另外一个状态转移的唯一性。
可以发现在枚举决策的时候 只有当前决策大于叶子节点的最大的那个再进行转移 此时这样就保证了每一种树都是以唯一的方式构造出来的。
证明 倒着想 考虑当前的一棵树的上一个状态 一定是当前状态减掉最大编号的叶子节点得到的 如果不是 那么上个状态是不能转移到当前状态的。
归纳一下可以得证。
const ll MAXN=11;
ll n,maxx,m,K;
ll sum[1<<MAXN];
ll f[1<<MAXN][1<<MAXN];
ll a[MAXN][MAXN];
signed main()
{
freopen("dead.in","r",stdin);
freopen("dead.out","w",stdout);
get(n);get(m);get(K);
rep(1,m,i)
{
ll get(x);ll get(y);
a[x][y]=a[y][x]=1;
}
rep(2,n,i)if(a[1][i])f[1|(1<<(i-1))][1|(1<<(i-1))]=1;
maxx=(1<<n)-1;
rep(1,maxx,i)sum[i]=sum[i>>1]+(i&1);
rep(1,maxx,i)
{
for(ll j=i;j;j=i&(j-1))
{
if(!f[i][j])continue;
for(ll k=1;k<=n;++k)
{
if(!(i&(1<<(k-1))))continue;
ll w=j;
if(j&((1<<(k-1))))w=w^(1<<(k-1));
for(ll cc=1;cc<=n;++cc)
{
if((1<<(cc-1))<w)continue;
if(i&(1<<(cc-1)))continue;
if(!a[k][cc])continue;
if(sum[w|(1<<(cc-1))]>K)continue;
f[i|(1<<(cc-1))][w|(1<<(cc-1))]+=f[i][j];
}
}
}
}
ll ans=0;
for(ll j=maxx;j;j=maxx&(j-1))if(sum[j]==K)ans+=f[maxx][j];
putl(ans);return 0;
}
一本通 高手训练 1781 死亡之树 状态压缩dp的更多相关文章
- HDU 4085 Peach Blossom Spring 斯坦纳树 状态压缩DP+SPFA
状态压缩dp+spfa解斯坦纳树 枚举子树的形态 dp[i][j] = min(dp[i][j], dp[i][k]+dp[i][l]) 当中k和l是对j的一个划分 依照边进行松弛 dp[i][j] ...
- POJ 3691 (AC自动机+状态压缩DP)
题目链接: http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...
- [动态规划]状态压缩DP小结
1.小技巧 枚举集合S的子集:for(int i = S; i > 0; i=(i-1)&S) 枚举包含S的集合:for(int i = S; i < (1<<n); ...
- Codeforces C. A Simple Task(状态压缩dp)
题目描述: A Simple Task time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- [知识点]状态压缩DP
// 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...
- HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
随机推荐
- day48 work
1 navicat自己玩一玩 2 练习题一定要搞懂 照着我的思路一遍遍的看敲 3 熟悉pymysql的使用 4 sql注入产生的原因和解决方法 了解 5 思考:如何结合mysql实现用户的注册和登录功 ...
- Mybatis插件扩展以及与Spring整合原理
@ 目录 前言 正文 插件扩展 1. Interceptor核心实现原理 2. Mybatis的拦截增强 Mybatis与Spring整合原理 1. SqlSessionFactory的创建 2. 扫 ...
- ELKF-分布式日志收集分析平台搭建 最小化 配置过程 - 查看收集日志(windows10下搭建)
前言 Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的.这三个产品被设计成一个集成解决方案,称为“Elastic Stack” ...
- CTFHub_技能树_SQL注入Ⅱ
SQL注入 MySQL结构 进行尝试: 尝试查看表名: 尝试查看列名: 发现无法直接输出: 使用时间注入脚本跑出结果: import requests import time session = re ...
- java 数据结构(七):Collection接口
1.单列集合框架结构|----Collection接口:单列集合,用来存储一个一个的对象* |----List接口:存储序的.可重复的数据. -->“动态”数组* |----ArrayList. ...
- 数据可视化实例(十六):有序条形图(matplotlib,pandas)
排序 (Ranking) 棒棒糖图 (Lollipop Chart) 棒棒糖图表以一种视觉上令人愉悦的方式提供与有序条形图类似的目的. https://datawhalechina.github.io ...
- mysql中DDL库和表的管理
#DDL /* 数据定义语言 库和表的管理 一.库的管理 创建.修改.删除 二.表的管理 创建.修改.删除 创建:create 修改:alter 删除:drop */ #一.库的管理 #1.库的创建 ...
- Docker、K8S网络工作原理
一.Docker 网络模式 在讨论 Kubernetes 网络之前,让我们先来看一下 Docker 网络.Docker 采用插件化的网络模式,默认提供 bridge.host.none.overlay ...
- SpringBoot代码生成器
Code-Generate 代码生成器 简介 一个基于原生Mysql & SpringBoot & Mybatis 的代码生成器,建表之后即可完全解放双手,适合: 规律性定制化开发 解 ...
- Ubuntu虚拟机设置共享文件夹
Ubuntu虚拟机设置共享文件夹 注:个人笔记,小白笔记. 点击设置 进入到Ubuntu 中 cd /mnt/hgfs/ 后 我们会看到自己设置的共享文件夹.