正题

题面链接:https://www.luogu.com.cn/problem/U142584


题目大意

nnn个010101串,按顺序分成两个序列,然后拼接成一个序列(拼接串x,yx,yx,y的话就是变成一个前缀包含xxx,后缀包含yyy的最短的串)。求最短长度。


解题思路

显然将010101串的状态压起来
定义prex,ipre_{x,i}prex,i​表示串xxx的前iii位,sufx,isuf_{x,i}sufx,i​表示串xxx的后iii位,comx,ycom_{x,y}comx,y​表示串x,yx,yx,y的最长公共位。
那么设fi,j,kf_{i,j,k}fi,j,k​表示到第iii个串,第一个串以aia_iai​结尾,第二个的后jjj位是kkk时的最小长度和。
那么第一种转移就是拼接ai−1a_{i-1}ai−1​和aia_iai​,也就是fi,j,k=fi−1,j,k+L−comai−1,aif_{i,j,k}=f_{i-1,j,k}+L-com_{a_{i-1},a_i}fi,j,k​=fi−1,j,k​+L−comai−1​,ai​​
第二种是aia_iai​和kkk拼起来,那么第一个串的kkk就变成了ai−1a_{i-1}ai−1​
fi,j,suf(ai−1,j)=fi−1,j,pre(ai,j)+L−jf_{i,j,suf(a_{i-1},j)}=f_{i-1,j,pre(a_i,j)}+L-jfi,j,suf(ai−1​,j)​=fi−1,j,pre(ai​,j)​+L−j

这样转移是O(n∗l∗2l)O(n*l*2^l)O(n∗l∗2l)的,显然无法通过本题

发现主要的时间落在第一个转移上,我们考虑优化掉第一个转移,我们发现每次的L−comai−1,aiL-com_{a_{i-1},a_i}L−comai−1​,ai​​是一个定值,我们可以先让最后的答案加上这些定值,然后第一个转移可以去掉,二个转移变为fi,j,suf(ai−1,j)=fi−1,j,pre(ai,j)+comai−1,ai−jf_{i,j,suf(a_{i-1},j)}=f_{i-1,j,pre(a_i,j)}+com_{a_{i-1},a_i}-jfi,j,suf(ai−1​,j)​=fi−1,j,pre(ai​,j)​+comai−1​,ai​​−j

时间复杂度O(n∗l)O(n*l)O(n∗l)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10,inf=2147483647/3;
int n,L,a[N],f[21][1<<21],ans;
char s[N];
int pre(int x,int i)
{return x>>(L-i);}
int suf(int x,int i)
{return x&((1<<i)-1);}
int com(int x,int y){for(int i=L;i>=0;i--)if(suf(x,i)==pre(y,i))return i;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",s);if(i==1)L=strlen(s);for(int j=0;j<L;j++)a[i]=(a[i]<<1)+(s[j]-'0');}memset(f,0x3f,sizeof(f));f[0][0]=L;for(int i=2;i<=n;i++){int tmp=L-com(a[i-1],a[i]),mins=inf;ans+=tmp;for(int j=0;j<=L;j++)mins=min(mins,f[j][pre(a[i],j)]+L-j-tmp);for(int j=0;j<=L;j++)f[j][suf(a[i-1],j)]=min(f[j][suf(a[i-1],j)],mins);}printf("%d\n",f[0][0]+ans);
}

[2020.11.27NOIP模拟赛]拼图王【dp】相关推荐

  1. [2020.11.27NOIP模拟赛]中位数之中位数【二分,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/U142585?contestId=37855 题目大意 nnn个数,求所有区间中位数的中位数. 解题思路 二分一个答 ...

  2. [2020.11.25NOIP模拟赛]出租车【dp】

    正题 题面链接:https://www.luogu.com.cn/problem/U142298?contestId=37766 题目大意 nnn个人有起点和终点,按顺序上车,但下车可以任意顺序,车最 ...

  3. [2020.11.25NOIP模拟赛]下棋【dp】

    正题 题目链接:https://www.luogu.com.cn/problem/U142297?contestId=37766 题目大意 nnn个白棋mmm个黑棋排成一排,要求没有任何一段黑白棋的个 ...

  4. [2020.11.26NOIP模拟赛]勇者的后缀【SA,RMQ,主席树,二分】

    正题 题目链接:https://www.luogu.com.cn/problem/U142356?contestId=37784 题目大意 一个字符串,询问给出(x,l,r)(x,l,r)(x,l,r ...

  5. [2020.11.26NOIP模拟赛]询问【字符串hash】

    正题 题目链接:https://www.luogu.com.cn/problem/U142342?contestId=37784 题目大意 一个字符串,定义两个字符串相似为用一些字母代替相同的字母后可 ...

  6. [2020.11.4NOIP模拟赛]简单的打击【NTT】

    正题 题目链接:https://www.luogu.com.cn/problem/U138580 题目大意 两个长度为nnn的序列,要求重排后同位置的相加后众数的个数最多. 解题思路 定义aia_ia ...

  7. [2020.11.3NOIP模拟赛]选数字【容斥】

    正题 题目链接:https://www.luogu.com.cn/problem/U138404?contestId=36493 题目大意 nnn个数字,每次询问一个区间有多少个三对数或为xxx. 解 ...

  8. 9.11 myl模拟赛

    9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...

  9. 2017.6.11 校内模拟赛

    题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...

最新文章

  1. 面试官钟爱的 8 个问题,这样答才能拿高薪 Offer!
  2. 实用PS技巧分享,送给初入职场的你
  3. uCOS:时钟节拍代码追踪
  4. 机器学习之超参数调优——超参数调优的方法
  5. Python + vs +Opencv
  6. Java SE下载方式
  7. 数学建模预测模型实例(二)---表白墙影响力量化模型
  8. TeXLive2021+TeXStudio安装及配置,亲测有效!
  9. 【IDE】【WebStorm】html排版设置head和body缩进
  10. 51单片机非阻塞串口中断收发数据
  11. 【微信小程序开发日记01】和风天气OUC之初步构想
  12. MobiCom2015阅读表(Poster)
  13. 三维空间刚体运动4-3:四元数线性插值方法:Squad
  14. (1)mysql--查询成绩最高和最低的人
  15. 为什么t检验要满足正态?
  16. 谁生活在地狱,自己心里都有数 ---Leo读 不是孙振耀写的职场感言 3
  17. 使用asp.net从零开始制作设计网站---转载
  18. VC6数据库综合开发资料
  19. MOOC翁凯_零基础学Java语言
  20. 基于使用方的火控系统的测试平台研究

热门文章

  1. 多个查询语句能否一次把结果导出_mysql表中base64格式数据查询
  2. HTML5中常见的列表标签包括,介绍几个常用的HTML5标签
  3. 大厂Java初级开发工程师!!!面试必问项之Set实现类:TreeSet
  4. vue 插入word模板 项目_10 分钟为你的 vue 项目编写代码文档
  5. 7-26 Windows消息队列 (25 分)(详解+思路+超时解决)
  6. 7-15 QQ帐户的申请与登陆 (25 分)(map做法+思路分析)
  7. [SpringBoot2]定制化原理_SpringBoot定制化组件的几种方式
  8. C++ class实现邻接表存储的图(完整代码)
  9. SQL10 用where过滤空值练习
  10. JavaMVC之JSON