[2020.11.27NOIP模拟赛]拼图王【dp】
正题
题面链接: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】相关推荐
- [2020.11.27NOIP模拟赛]中位数之中位数【二分,树状数组】
正题 题目链接:https://www.luogu.com.cn/problem/U142585?contestId=37855 题目大意 nnn个数,求所有区间中位数的中位数. 解题思路 二分一个答 ...
- [2020.11.25NOIP模拟赛]出租车【dp】
正题 题面链接:https://www.luogu.com.cn/problem/U142298?contestId=37766 题目大意 nnn个人有起点和终点,按顺序上车,但下车可以任意顺序,车最 ...
- [2020.11.25NOIP模拟赛]下棋【dp】
正题 题目链接:https://www.luogu.com.cn/problem/U142297?contestId=37766 题目大意 nnn个白棋mmm个黑棋排成一排,要求没有任何一段黑白棋的个 ...
- [2020.11.26NOIP模拟赛]勇者的后缀【SA,RMQ,主席树,二分】
正题 题目链接:https://www.luogu.com.cn/problem/U142356?contestId=37784 题目大意 一个字符串,询问给出(x,l,r)(x,l,r)(x,l,r ...
- [2020.11.26NOIP模拟赛]询问【字符串hash】
正题 题目链接:https://www.luogu.com.cn/problem/U142342?contestId=37784 题目大意 一个字符串,定义两个字符串相似为用一些字母代替相同的字母后可 ...
- [2020.11.4NOIP模拟赛]简单的打击【NTT】
正题 题目链接:https://www.luogu.com.cn/problem/U138580 题目大意 两个长度为nnn的序列,要求重排后同位置的相加后众数的个数最多. 解题思路 定义aia_ia ...
- [2020.11.3NOIP模拟赛]选数字【容斥】
正题 题目链接:https://www.luogu.com.cn/problem/U138404?contestId=36493 题目大意 nnn个数字,每次询问一个区间有多少个三对数或为xxx. 解 ...
- 9.11 myl模拟赛
9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...
- 2017.6.11 校内模拟赛
题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...
最新文章
- 面试官钟爱的 8 个问题,这样答才能拿高薪 Offer!
- 实用PS技巧分享,送给初入职场的你
- uCOS:时钟节拍代码追踪
- 机器学习之超参数调优——超参数调优的方法
- Python + vs +Opencv
- Java SE下载方式
- 数学建模预测模型实例(二)---表白墙影响力量化模型
- TeXLive2021+TeXStudio安装及配置,亲测有效!
- 【IDE】【WebStorm】html排版设置head和body缩进
- 51单片机非阻塞串口中断收发数据
- 【微信小程序开发日记01】和风天气OUC之初步构想
- MobiCom2015阅读表(Poster)
- 三维空间刚体运动4-3:四元数线性插值方法:Squad
- (1)mysql--查询成绩最高和最低的人
- 为什么t检验要满足正态?
- 谁生活在地狱,自己心里都有数 ---Leo读 不是孙振耀写的职场感言 3
- 使用asp.net从零开始制作设计网站---转载
- VC6数据库综合开发资料
- MOOC翁凯_零基础学Java语言
- 基于使用方的火控系统的测试平台研究
热门文章
- 多个查询语句能否一次把结果导出_mysql表中base64格式数据查询
- HTML5中常见的列表标签包括,介绍几个常用的HTML5标签
- 大厂Java初级开发工程师!!!面试必问项之Set实现类:TreeSet
- vue 插入word模板 项目_10 分钟为你的 vue 项目编写代码文档
- 7-26 Windows消息队列 (25 分)(详解+思路+超时解决)
- 7-15 QQ帐户的申请与登陆 (25 分)(map做法+思路分析)
- [SpringBoot2]定制化原理_SpringBoot定制化组件的几种方式
- C++ class实现邻接表存储的图(完整代码)
- SQL10 用where过滤空值练习
- JavaMVC之JSON