[JZOJ3105]拼图
题目大意:
给你一个起始串$a(|a|\leq 300)$,一个目标串$b(|b|\leq 300)$,以及$n(n\leq 8)$个小串$s_0,s_2,\ldots,s_{n-1}(|s_i|\leq 400)$,你可以进行若干次操作将$a$变成$b$。
操作的规则如下:
1.取出每个小串的任一后缀,代价为去除后缀的长度;
2.移除起始串中的若干字符,每移除一个字符需要$1$的代价。
3.选择一些小串并将其插入到$a$中(包括左边界,不包括右边界);
问将$a$变成$b$的最小代价。
思路:
状压DP。
用$f_{i,j}=k$表示选取小串的状态为$i$,目标串匹配长度为$j$时,起始串$a$匹配的最少长度为$k$。
对于状态$f_{i,j}$转移时分两种情况,一种是用起始串的一个字母匹配,另一种是用小串来匹配。
用起始串匹配时,找到$a$中下一个和$b_{j+1}$相同的字符$a_k$,向$f_{i,j+1}$转移。
用小串匹配时,枚举没有选过的小串$s_k$找到能和目标串匹配的最长前缀长度$l$,向$f_{i+2^k,j+l}$转移。
最后统计答案时,枚举最后小串选取的状态,答案即为起始串长度+选取的小串长度-目标串长度。
边界情况:$f_{i,j}\geq|a|$,这时再转移就到了$a$的右边界,因此不予转移。
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const unsigned inf=~0u;
const int LEN1=,LEN2=,N=;
char s1[LEN1],s2[LEN1],s[N][LEN2];
unsigned f[<<N][LEN1],len1,len2,len3[N];
int main() {
scanf("%s%s",&s1[],&s2[]);
len1=strlen(&s1[]),len2=strlen(&s2[]);
const int n=getint();
for(register int i=;i<n;i++) {
scanf("%s",&s[i][]);
len3[i]=strlen(&s[i][]);
}
memset(f,0xff,sizeof f);
f[][]=;
for(register int i=;i<<<n;i++) {
for(register int j=;j<(int)len2;j++) {
if(f[i][j]>=len1) continue;
for(register unsigned k=f[i][j]+;s1[k];k++) {
if(s1[k]==s2[j+]) {
f[i][j+]=std::min(f[i][j+],k);
break;
}
}
for(register int k=;k<n;k++) {
if(i&(<<k)) continue;
for(register int l=;s[k][l]&&j+l<=(int)len2&&s[k][l]==s2[j+l];l++) {
f[i|(<<k)][j+l]=std::min(f[i|(<<k)][j+l],f[i][j]);
}
}
}
}
unsigned ans=inf;
for(register int i=;i<<<n;i++) {
if(f[i][len2]==inf) continue;
unsigned tmp=;
for(register int j=;j<n;j++) {
if(i&(<<j)) tmp+=len3[j];
}
ans=std::min(ans,len1+tmp-len2);
}
printf("%u\n",ans);
return ;
}
[JZOJ3105]拼图的更多相关文章
- 拼图小游戏之计算后样式与CSS动画的冲突
先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...
- JavaScript版拼图小游戏
慕课网上准备开个新的jQuery教程,花了3天空闲时间写了一个Javascript版的拼图小游戏,作为新教程配套的分析案例 拼图游戏网上有不少的实现案例了,但是此源码是我自己的实现,所以不做太多的比较 ...
- 利用Vue.js实现拼图游戏
之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/luozhihao/p/5 ...
- WPF学习系列 游戏-选张图片做成9宫格拼图
今天要学习一个拼图项目. 目标是传入一张图片,然后将它分成9份,去掉一份,鼠标点击进行拼图. 源文件结构很简单 第一步.新建项目 这一步没什么好说的,新建一个项目就跟源文件结构一样了 第二步.页面布局 ...
- 原生js完成拼图小游戏
废话不说,看代码,图片可以自己找,我这直接引用了百度的了 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml ...
- ACM: NBUT 1105 多连块拼图 - 水题 - 模拟
NBUT 1105 多连块拼图 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format: Practice Appoint ...
- JavaScript拼图游戏
今天是2016年最后一天上班了.最近几天都比较休闲,有时间空闲下来写写文档之类的. 2016过得真是快.感觉没做什么就过去了.想到之前想坚持每个月写一写博客都没坚持到.希望2017年可以吧. 无聊之余 ...
- MyFirstgame 拼图
package auto; /** * IDA*求解15puzzle问题 * IDA*整合了IDDFS和A*算法.其中IDDFS控制了求解过程中的内存开销,A*算法意味着"启发式" ...
- 关于有偿提供拼图响应式后台的通知---------pintuer ui的官方通知(www.pintuer.com)
拼图响应式前端框架版响应式后台正式发布. 考虑到目前拼图的状况,我们不打算免费开放下载,但也不会收各位朋友1分钱,该版后台将有偿提供给各位给予拼图贡献的朋友. 废话不多说,一切皆以有图有真相,下面上图 ...
随机推荐
- SPOJ - DQUERY(区间不同数+树状数组)
链接:SPOJ - DQUERY 题意:求给定区间不同数的个数(不更新). 题解:离线+树状数组. 对所求的所有区间(l, r)根据r从小到大排序.从1-n依次遍历序列数组,在树状数组中不断更新a[i ...
- 孤荷凌寒自学python第二十天python的匿名函数与偏函数
孤荷凌寒自学python第二十天python的匿名函数与偏函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python为使函数的使用更加方便高效,可以使用两种特殊的函数简化语句书写. 一 ...
- sshd_config_for_centos
# $OpenBSD: sshd_config,v // :: djm Exp $ # This is the sshd server system-wide configuration file. ...
- kvm搭建完成了,那么问题来了,到底是什么原理
kvm中到底是怎么模拟的CPU和内存? 收到了大量的 这里有一个裸的调用kvm接口的实例,超赞: http://www.cnblogs.com/Bozh/p/5753379.html 使用kvm的AP ...
- 四、vue派发更新
收集的目的就是为了当我们修改数据的时候,可以对相关的依赖派发更新,那么这一节我们来详细分析这个过程. setter 部分的逻辑: /** * Define a reactive property on ...
- 看了就学会之React redux入门示例
环境准备 为了方便,这里使用create-react-app搭建react环境 create-react-app mydemo 弹出配置 如果需要自定义react的配置,需要运行下面的命令把配置文件弹 ...
- 洛谷 P1503 鬼子进村 解题报告
P1503 鬼子进村 题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. ...
- Windows7下的Run运行命令一览表
按住Windows键(就是左边Ctrl和Alt之间那个印windows徽标的键,简称Win键)+R,即可弹出运行对话框,在里面输入黑体字符即可运行相应程序.相比XP这次新增了不少新东西. 添加/删除程 ...
- xpath和CSS选择器
.content是二进制 用来处理声音.图片.视频 .text是文本 xpath语法: /一层层查找 //不固定位置 //title/text() @选取属性 [@href]和[@href=''] . ...
- VS MFC 添加菜单
新建出来的基于对话框的MFC工程是没有菜单的,如何在对话框中添加菜单?又如何给菜单的菜单项添加事件应用响应?下面小编来具体描述一下,希望能帮助到一些人. 工具/原料 电脑一台 VS2010 方法/ ...