当前位置:网站首页>[COCI] Vještica (子集dp)
[COCI] Vještica (子集dp)
2022-04-23 06:21:00 【Zimba_】
题意:
给定 n ( n ≤ 16 ) n(n\leq 16) n(n≤16)个串。你可以把串内的字母任意排列,使得将这些串插入字典树后的结点最少。
串总长不超过 1 0 6 10^{6} 106.
思路:
只有 16 16 16位,考虑状压表示集合。
用 D P ( ( 10111 ) 2 ) DP((10111)_{2}) DP((10111)2)表示第 1 , 3 , 4 , 5 1,3,4,5 1,3,4,5串被插入后的最小结点数。
先考虑两个串插入字典树,贡献的结点数是两个串的结点数之和减去两个串的前缀。
所以,我们考虑两个串的前缀要最长,就是每个字母的个数取 m i n min min的和。
那么考虑几个串 " a a b c " , " a a b b " . " a b c " "aabc","aabb"."abc" "aabc","aabb"."abc"。可以贪心地拿出 " a b " "ab" "ab"放前面,然后剩下 " a c " , " a b " . " c " "ac","ab"."c" "ac","ab"."c"再进行考虑。
用 P R E ( S ) PRE(S) PRE(S)表示集合 S S S中所有串的最长公共前缀,考虑从 ( " a c " , " a b " ) ("ac","ab") ("ac","ab")和 ( " c " ) ("c") ("c")合并到 ( " a c " , " a b " , " c " ) ("ac","ab","c") ("ac","ab","c")。
D P ( " a a b c " , " a a b b " , " a b c " ) DP("aabc","aabb","abc") DP("aabc","aabb","abc")
= D P ( " a c " , " a b " , " c " ) + P R E ( “ a a b c ” , " a a b b " . " a b c " ) =DP("ac","ab","c")+PRE(“aabc”,"aabb"."abc") =DP("ac","ab","c")+PRE(“aabc”,"aabb"."abc")
= D P ( " a c " , " a b " ) + D P ( " c " ) + P R E ( " a a b c " , “ a a b b ” , " a b c " ) =DP("ac","ab")+DP("c")+PRE("aabc",“aabb”,"abc") =DP("ac","ab")+DP("c")+PRE("aabc",“aabb”,"abc")
= D P ( " a a b c " , " a a b b " ) − P R E ( " a b " , " a b " ) + D P ( " a b c " ) − P R E ( " a b " ) + P R E ( " a a b c " , “ a a b b ” , " a b c " ) =DP("aabc","aabb")-PRE("ab","ab")+DP("abc")-PRE("ab")+PRE("aabc",“aabb”,"abc") =DP("aabc","aabb")−PRE("ab","ab")+DP("abc")−PRE("ab")+PRE("aabc",“aabb”,"abc")
= D P ( " a a b c " , " a a b b " ) + D P ( " a b c " ) − P R E ( " a a b c " , “ a a b b ” , " a b c " ) =DP("aabc","aabb")+DP("abc")-PRE("aabc",“aabb”,"abc") =DP("aabc","aabb")+DP("abc")−PRE("aabc",“aabb”,"abc")
那么我们考虑 S S S从它的子集 A A A转移过来,就有 D P ( S ) = D P ( A ) + D P ( S − A ) + P R E ( S ) DP(S)=DP(A)+DP(S-A)+PRE(S) DP(S)=DP(A)+DP(S−A)+PRE(S)。
然后就可以做子集 d p dp dp了,复杂度 o ( 3 n ) o(3^{n}) o(3n)。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int num1[1000005];
int getNum(int x)
{
if(num1[x])return num1[x];
int ans=0;
while(x!=0)
{
x-=x&-x;
ans++;
}
return num1[x]=ans;
}
int len[20];
int num[20][26];
char ss[1000005];
int n;
int pre(int s)
{
int nu[26];
for(int i=0;i<26;i++)nu[i]=1e9;
for(int i=0;i<n;i++)if((s>>i)&1)
{
for(int j=0;j<26;j++)nu[j]=min(nu[j],num[i][j]);
}
int sum=0;
for(int i=0;i<26;i++)sum+=nu[i];
return sum;
}
int dp[1000005];
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",ss);
len[i]=strlen(ss);
for(int j=0;j<len[i];j++)num[i][ss[j]-'a']++;
}
for(int s=1;s<1<<n;s++)
{
dp[s]=1e9;
if(getNum(s)==1)
{
for(int i=0;i<n;i++)if((s>>i)&1)dp[s]=len[i];
continue;
}
int preS=pre(s);
for (int i=(s-1)&s;i;i=(i-1)&s)
{
dp[s]=min(dp[s],dp[i]+dp[s^i]-preS);
}
}
printf("%d\n",dp[(1<<n)-1]+1);
return 0;
}
版权声明
本文为[Zimba_]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43785386/article/details/108967450
边栏推荐
- 特殊成员与魔法方法
- 记录一个查询兼容性的网站,String.replaceAll()兼容性报错
- golang实现正则匹配:密码包含至少一位数字,字母和特殊字符,且长度8-16
- JDBC连接池
- Object. Create() principle, object Create() specification, handwritten object create(),Object. Create() usage
- 浅谈BFC(块格式化上下文)
- PyTorch 13. Nested functions and closures (dog head)
- Failed to install Tui editor, quick solution
- Transformer的pytorch实现
- LATEX公式注意事项
猜你喜欢

Metro wireless intercom system

学习笔记6-几种深度学习卷积神经网络的总结

免费开源智能充电桩物联网SAAS云平台

数论分块(整除分块)

关于'enum'枚举类型以及结构体的问题。

记录一些npm 有关的问题(杂乱记录)

vim+ctags+cscpope开发环境搭建指南

Educational Codeforces Round 81 (Rated for Div. 2)

Machine vision series (02) -- tensorflow2 3 + win10 + GPU installation

Meishe technology launches professional video editing solution for desktop -- Meiying PC version
随机推荐
基于可视化结构的身份证号码校验系统-树莓派实现
记录一些npm 有关的问题(杂乱记录)
LATEX公式注意事项
Us photo cloud editing helps BiliBili upgrade its experience
el-date-picker中自定义快捷选项picker-options,动态设置禁用日期
[LNOI2014]LCA——树链剖分——多点LCA深度和问题
manjaro安装与配置(vscode,微信,美化,输入法)
字节跳动2020秋招编程题:根据工号快速找到自己的排名
ES6之箭头函数细谈
快速下载vscode的方法
可视化常见问题解决方案(八)数学公式
P1446 [HNOI2008]Cards(Burnside定理+dp计数)
按需引入vant组件
菜菜的并发编程笔记 |(九)异步IO实现并发爬虫加速
华为云MVP邮件
Typora操作技巧说明(一).md
presto日期函数的使用
C语言的指针符号到底靠近变量类型还是变量名?
Dirichlet 前缀和(数论优化式子复杂度利器)
HQL语句的调优