一本通 高手训练 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
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
随机推荐
- 前端性能优化_css加载会造成哪些阻塞现象?
css的加载是不会阻塞DOM的解析,但是会阻塞DOM的渲染,会阻塞link后面js语句的执行.这是由于浏览器为了防止html页面的重复渲染而降低性能,所以浏览器只会在加载的时候去解析dom树,然后等在 ...
- 线程基础知识01-Thread类,Runnable接口
常见面试题:创建一个线程的常用方法有哪些?Thread创建线程和Runnable创建线程有什么区别? 答案通常集中在,继承类和实现接口的差别上面: 如果深入问一些问题:1.要执行的任务写在run()方 ...
- zabbix fping 监控网络质量
1,zabbix server (proxy)安装fping wget http://www.fping.org/dist/fping-3.16.tar.gz tar zxvf fping-3.16. ...
- CF1051F The Shortest Statement 题解
题目 You are given a weighed undirected connected graph, consisting of n vertices and m edges. You sho ...
- Oracle 对表的基本CURD操作
Oracle对表的基本Curd操作: 样式表: 接下来对这张(表明:Stud)表进行Curd操作(请看面SQL代码) 增加新的字段列:alter table Stud add(heigh ...
- 题解:2018级算法第四次上机 C4-最小乘法
题目描述: 样例: 实现解释: 和字符串处理结合的动态规划,个人认为比较难分析出状态转移方程,虽然懂了之后挺好理解的 知识点: 动态规划,字符串转数字 题目分析: 首先按照最基础:依据题意设计原始dp ...
- bugku extract 变量覆盖
- java 面向对象(三十五):泛型在继承上的体现
泛型在继承上的体现: /* 1. 泛型在继承方面的体现 虽然类A是类B的父类,但是G<A> 和G<B>二者不具备子父类关系,二者是并列关系. 补充:类A是类B的父类,A< ...
- python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法
目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...
- 数据清洗与准备知识图谱-《利用Python进行数据分析》
所有内容整理自<利用Python进行数据分析>,使用MindMaster Pro 7.3制作,emmx格式,源文件已经上传Github,需要的同学转左上角自行下载或者右击保存图片.