题目大意:
   给你一个起始串$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]拼图的更多相关文章

  1. 拼图小游戏之计算后样式与CSS动画的冲突

    先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...

  2. JavaScript版拼图小游戏

    慕课网上准备开个新的jQuery教程,花了3天空闲时间写了一个Javascript版的拼图小游戏,作为新教程配套的分析案例 拼图游戏网上有不少的实现案例了,但是此源码是我自己的实现,所以不做太多的比较 ...

  3. 利用Vue.js实现拼图游戏

    之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/luozhihao/p/5 ...

  4. WPF学习系列 游戏-选张图片做成9宫格拼图

    今天要学习一个拼图项目. 目标是传入一张图片,然后将它分成9份,去掉一份,鼠标点击进行拼图. 源文件结构很简单 第一步.新建项目 这一步没什么好说的,新建一个项目就跟源文件结构一样了 第二步.页面布局 ...

  5. 原生js完成拼图小游戏

    废话不说,看代码,图片可以自己找,我这直接引用了百度的了 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml ...

  6. ACM: NBUT 1105 多连块拼图 - 水题 - 模拟

    NBUT 1105  多连块拼图 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:  Practice  Appoint ...

  7. JavaScript拼图游戏

    今天是2016年最后一天上班了.最近几天都比较休闲,有时间空闲下来写写文档之类的. 2016过得真是快.感觉没做什么就过去了.想到之前想坚持每个月写一写博客都没坚持到.希望2017年可以吧. 无聊之余 ...

  8. MyFirstgame 拼图

    package auto; /** * IDA*求解15puzzle问题 * IDA*整合了IDDFS和A*算法.其中IDDFS控制了求解过程中的内存开销,A*算法意味着"启发式" ...

  9. 关于有偿提供拼图响应式后台的通知---------pintuer ui的官方通知(www.pintuer.com)

    拼图响应式前端框架版响应式后台正式发布. 考虑到目前拼图的状况,我们不打算免费开放下载,但也不会收各位朋友1分钱,该版后台将有偿提供给各位给予拼图贡献的朋友. 废话不多说,一切皆以有图有真相,下面上图 ...

随机推荐

  1. selenium启动IE浏览器报错:selenium.common.exceptions.WebDriverException: Message: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode mu

    意思是浏览器的保护模式设置不一致所导致 解决方案-->修改IE设置 将所有区域的保护模式勾选去掉即可

  2. linux备忘录-vi和vim

    知识点 vi的三种模式 一般模式 按 ESC 可回到一般模式 相关按键 j 代表 向下按钮 k 代表 向上按钮 h 代表 向左按钮 l 代表 向右按钮 20j 等代表 向下移动20行 Ctrl + f ...

  3. ASP.NET 抓取网页内容

    (转)ASP.NET 抓取网页内容 ASP.NET 抓取网页内容-文字 ASP.NET 中抓取网页内容是非常方便的,而其中更是解决了 ASP 中困扰我们的编码问题. 需要三个类:WebRequest. ...

  4. Vue.js入门(一)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <meta htt ...

  5. select chosen 禁用下拉框某一个option

    $("#tbParBudCode option[value='" + budCodeId + "']").attr("disabled", ...

  6. c# 对XML 解析 和 序列化

    /// <summary> /// 解析XML 数据 /// </summary> /// <param name="re"></para ...

  7. Tomcat学习笔记(三)

    Tomcat连接器 tomcat连接器是tomcat的一个核心组件,在tomcat4中的实现原理如下 1.实现Connector接口 2.创建Request对象 3.创建Response对象 tomc ...

  8. eclipse安装使用jetty

    安装: 直接从eclipse中的eclipse_market中下载即可,关键说下配置项目的访问路径:

  9. linux常用60条命令 转

    Linux必学的60个命令   Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命 ...

  10. kubernetes 搭建集群外部ip服务

    nginx-pod.yaml apiVersion: v1 kind: Pod metadata: name: webapp labels: app: webapp spec: containers: ...