当前位置:网站首页>[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
边栏推荐
- Machine vision series (01) -- Overview
- (一)OpenPAI jupyter jupyterhub jupyterlab 方案比较
- 记录一个查询兼容性的网站,String.replaceAll()兼容性报错
- 可视化常见问题解决方案(七)画图刻度设置解决方案
- golang实现一个带Web界面的五险一金计算器
- Background management system framework, there is always what you want
- 两个线程交互打印奇偶数字
- 小程序wx.previewMedia相关问题解决-日常踩坑
- Tensorflow安装后ImportError: DLL load failed: 找不到指定的模块,且国内安装缓慢
- manjaro安装与配置(vscode,微信,美化,输入法)
猜你喜欢
[COCI]Lampice (二分+树分治+字符串哈希)
基于可视化结构的身份证号码校验系统-树莓派实现
Educational Codeforces Round 81 (Rated for Div. 2)
Background management system framework, there is always what you want
Take you to travel in space, and American photography technology provides comprehensive technical support for aerospace creative applet
The people of Beifeng have been taking action
自定义钉钉机器人进行报警
自定义classloader并实现热部署-使用loadClass
菜菜的并发编程笔记 |(九)异步IO实现并发爬虫加速
通过sparksql读取presto中的数据存到clickhouse
随机推荐
青龙面板拉库命令更新【2022/4/20】收藏不走丢
使用el-popconfirm和el-backtop不生效
How does the public and Private Integrated walkie talkie realize cooperative work under multi-mode communication?
浅谈BFC(块格式化上下文)
菜菜的并发编程笔记 |(九)异步IO实现并发爬虫加速
van-uploader上传图片实现过程、使用原生input实现上传图片
可视化常见问题解决方案(七)画图刻度设置解决方案
组合数求解与(扩展)卢卡斯定理
remote: Support for password authentication was removed on August 13, 2021.
关于'enum'枚举类型以及结构体的问题。
学习笔记6-几种深度学习卷积神经网络的总结
hql求一个范围内最大值
两个线程交互打印奇偶数字
Take you to travel in space, and American photography technology provides comprehensive technical support for aerospace creative applet
el-date-picker中自定义快捷选项picker-options,动态设置禁用日期
数论之拓展欧几里得
go语言映射操作
PyTorch 13. Nested functions and closures (dog head)
Transformer的pytorch实现
golang实现MD5,SHA256,bcrypt加密