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的更多相关文章

  1. 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]  ...

  2. POJ 3691 (AC自动机+状态压缩DP)

    题目链接:  http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...

  3. [动态规划]状态压缩DP小结

     1.小技巧 枚举集合S的子集:for(int i = S; i > 0; i=(i-1)&S) 枚举包含S的集合:for(int i = S; i < (1<<n); ...

  4. Codeforces C. A Simple Task(状态压缩dp)

    题目描述:  A Simple Task time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  5. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  6. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  7. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

  8. HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP

    题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...

  9. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

随机推荐

  1. Blazor带我重玩前端(二)

    概览 Blazor目前有两种托管模式,一种是Server-Side模式,一种是WebAssembly模式.官方首先支持的是Service-Side模式,使用WebAssembly模式,需要更新到最新版 ...

  2. Java 基础 —— Lambda 表达式

    概述 阅读项目代码时,尤其是阅读一些源码时,经常会遇到 Lambda 表达式.对此之前看过相关文章,但是停留在模模糊糊的印象上.今天趁着有时间,通过一些 demo 示例,梳理一下它的用法,以备后期遗忘 ...

  3. 玩转 Windows Terminal

    今天给大家分享一下Windows Terminal的使用及个性化定制. 一.安装 该项目的开源地址为https://github.com/microsoft/terminal,如果想折腾,可以按照上面 ...

  4. CSS(二)- 选择器 - 一定要搞懂的选择器优先级和权重问题

    css的优先级之前一直没怎么注意没当回事,总以为对同一元素靠后的渲染会覆盖前面的渲染,要是覆盖不了那就来个!important嘛.直到我那在学前端基础的后端伙伴拿一个问题问住了我,我才意识到这是重点中 ...

  5. 02 drf源码剖析之快速了解drf

    02 drf源码剖析之快速了解drf 目录 02 drf源码剖析之快速了解drf 1. 什么是drf 2. 安装 3. 使用 3. DRF的应用场景 1. 什么是drf drf是一个基于django开 ...

  6. python 装饰器(八):装饰器实例(五)函数装饰器装饰类以及类方法

    函数装饰器装饰类 单例模式 from functools import wraps def singleton(cls): instances = {} @wraps(cls) def get_ins ...

  7. saver 的保存与恢复

    模型保存,先要创建一个Saver对象:saver=tf.train.Saver(), max_to_keep 是用来设置保存模型的个数,默认为5,即保存最近的五个模型,saver=tf.train.S ...

  8. web前端知识点(webpack篇)

    webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency gr ...

  9. 循序渐进VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理

    在前面随笔<循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理>中介绍了用户管理模块的内容,包括用户列表的展示,各种查看.编辑.新增对话框的界面处理和后台数据处 ...

  10. 更优雅的在 Xunit 中使用依赖注入

    Xunit.DependencyInjection 7.0 发布了 Intro 上次我们已经介绍过一次大师的 Xunit.DependencyInjection https://www.cnblogs ...