【ZJOI2017 Round1练习】D4T2 trie(贪心,状压DP)
题意:现在 Matej 手上有 N 个英文小写字母组成的单词,
他想知道,如果将这 N 个单词中的字母分别进行重新排列,形成的字母树的节点数最少是多少。
n<=16,len[i]<=1000000
思路:
显然,如果我们希望 Trie 树的节点数尽量少,我们应该先将所有单词公共的字母拿出来,作为 Trie 树最上几层的初始链。
比如说我们有 aaab, baab 和 cab 三个单词,我们会将ab 挑出来,然后剩下的单词就变成了 aa, ab, c。
对于剩下的单词, 我们将其分成两个子集,( aa, ab)和( c),并分别再计算最长的公
共字母链。显然,当集合中有 n 个单词时,有 2^n种方式将这些单词分成两个子集。
由此,我们可以用状态压缩 dp 解决这个问题。一个状态由单词的子集来描述,也就是
说我们有 2^n个状态,并计算每一种子集形成 Trie 树需要的最少节点数,转移时枚举如何将
子集分裂成两个更小的子集,即可解决整个问题。整个算法总的时间复杂度为 O(3^n)。
var a:array[..,..]of longint;
dp,f:array[..]of longint;
num:array[..]of longint;
n,i,j,k:longint;
ch:ansistring; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; procedure dfs(k,sta:longint);
var i,j:longint;
begin
if k=n+ then
begin
f[sta]:=;
for i:= to do num[i]:=<<;
for i:= to n do
if sta and (<<(i-))> then
for j:= to do num[j]:=min(num[j],a[i,j]);
for i:= to do f[sta]:=f[sta]+num[i];
exit;
end;
dfs(k+,(sta<<)+);
dfs(k+,sta<<);
end; begin
assign(input,'trie.in'); reset(input);
assign(output,'trie.out'); rewrite(output);
readln(n);
fillchar(dp,sizeof(dp),$7f);
for i:= to n do
begin
readln(ch);
k:=length(ch); dp[<<(i-)]:=k;
for j:= to k do inc(a[i,ord(ch[j])-ord('a')+]);
end;
dfs(,);
for i:= to (<<n)- do
begin
j:=i-;
while j> do
begin
dp[i]:=min(dp[i],dp[j]+dp[i xor j]-f[i]);
j:=i and (j-);
end;
end;
writeln(dp[(<<n)-]+);
close(input);
close(output);
end.
【ZJOI2017 Round1练习】D4T2 trie(贪心,状压DP)的更多相关文章
- POJ 1795 DNA Laboratory (贪心+状压DP)
题意:给定 n 个 字符串,让你构造出一个最短,字典序最小的字符串,包括这 n 个字符串. 析:首先使用状压DP,是很容易看出来的,dp[s][i] 表示已经满足 s 集合的字符串以 第 i 个字符串 ...
- bzoj3717 [PA2014]Pakowanie 贪心+状压DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3717 题解 这道题大概也就只能算常规的状压 DP 吧,但是这个状态和转移的设计还是不是很好想. ...
- BZOJ4560 JLOI2016字符串覆盖(kmp+贪心+状压dp+单调队列)
首先kmp求出每个子串能放在哪些位置.接下来的两部分贪心和状压都可以,各取比较方便的. 最大值考虑贪心.考虑枚举子串的左端点出现顺序,在此基础上每个子串的位置肯定都应该尽量靠前,有是否与上个子串有交两 ...
- HDU 3341 Lost's revenge ( Trie图 && 状压DP && 数量限制类型 )
题意 : 给出 n 个模式串,最后给出一个主串,问你主串打乱重组的情况下,最多能够包含多少个模式串. 分析 : 如果你做过类似 Trie图 || AC自动机 + DP 类似的题目的话,那么这道题相对之 ...
- HDU 4758 Walk Through Squares ( Trie图 && 状压DP && 数量限制类型 )
题意 : 给出一个 n 行.m 列的方格图,现从图左上角(0, 0) 到右下角的 (n, m)走出一个字符串(规定只能往下或者往右走),向右走代表' R ' 向下走则是代表 ' D ' 最后从左上角到 ...
- CodeForces165E 位运算 贪心 + 状压dp
http://codeforces.com/problemset/problem/165/E 题意 两个整数 x 和 y 是 兼容的,如果它们的位运算 "AND" 结果等于 0,亦 ...
- 【ZJOI2017 Round1练习&BZOJ4774】D3T2 road(斯坦纳树,状压DP)
题意: 对于边带权的无向图 G = (V, E),请选择一些边, 使得1<=i<=d,i号节点和 n − i + 1 号节点可以通过选中的边连通, 最小化选中的所有边的权值和. d< ...
- 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)
[描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...
- Codeforces 429C Guess the Tree(状压DP+贪心)
吐槽:这道题真心坑...做了一整天,我太蒻了... 题意 构造一棵 $ n $ 个节点的树,要求满足以下条件: 每个非叶子节点至少包含2个儿子: 以节点 $ i $ 为根的子树中必须包含 $ c_i ...
- 刷题总结——树有几多愁(51nod1673 虚树+状压dp+贪心)
题目: lyk有一棵树,它想给这棵树重标号. 重标号后,这棵树的所有叶子节点的值为它到根的路径上的编号最小的点的编号. 这棵树的烦恼值为所有叶子节点的值的乘积. lyk想让这棵树的烦恼值最大,你只需输 ...
随机推荐
- 图形化unix/linux 工具 mobarxterm
1.使用 mobarxterm 图形化登录工具 2. 如果服务器是图形化界面启动的,xhost +命令可以不用执行 [root@test ~]# xhost +xhost: unable to o ...
- javascript 笔记--变量
用了这么久的Javascript,该总结下了!温故而知新! var 声明变量: javascript 是弱类型语言,因此无需为声明对象明确类型声明. 如:var test="字符串" ...
- VS2012出现加载失败时的解决办法 win7同样适用
今天更新了WIN8系统补丁,然后就出现了大量的问题,特别是经常用的软件像VS2012 老是加载失败,还说是缺少什么包一类的,弄了好长段时间终于解决了,现在将经验分享下 工具/原料 VS2012+WIN ...
- Spring && 实验IOC
一.Spring作用 1.生态体系庞大,全能型选手![springmvc是其一个子模块,jdbcTemplate能直接操作数据库!] 2.将其他组件粘合在一起 3.IOC容器和AOP[As ...
- 怪物猎人OL简单测评与碎碎念
请移步我的个人网站查看: www.wuduojia.cn
- 461在全志r16平台tinav3.0系统下使用地磁计QMC5883L
461在全志r16平台tinav3.0系统下使用地磁计QMC5883L 2018/9/7 14:08 版本:V1.0 开发板:SC3817R SDK:tina v3.0 (基本确认全志tina v3. ...
- 微信轻松接入QQ客服
一直以来,大家都苦恼怎么实现微信公众帐号可以接入客服,也因此很多第三方接口平台也开发客服系统CRM系统,不过不是操作复杂就是成本太高.今天分享一个低成本又简便的方法,让你的公众帐号接入QQ客服.下面介 ...
- zabbix企业应用之windows系统安装omsa硬件监控
具体请参考 作者:dl528888http://dl528888.blog.51cto.com/2382721/1421335 大致 1.安装OMSA http://zh.community.de ...
- cf536c——思路题
题目 题目:Lunar New Year and Number Division 题目大意:给定一个数字序列,可以任意分组(可调整顺序),但每组至少两个,求每组内数字和的平方的最小值 思路 首先,易证 ...
- 几个net命令
A.显示当前工作组服务器列表 net view,当不带选项使用本命令时,它就会显示当前域或网络上的计算机上的列表. 比如:查看这个IP上的共享资源,就可以 C:\\>net view 192 ...