2019.10.25字符串——zr
题意:
给你两个字符串,由01组成;求他们两个的最短公共非子序列,要求字典序最小;
非公共子序列:都不是这两个字符串的子序列;
本人只会暴力啊,二进制枚举稳拿15分;
然而这道题其实是一个最短路题;
题解:
贪心考虑从前往后s1……si,维护一个j表示当前字符串已经匹配到t1……tj,
贪心考虑tj'=si+1的j'匹配;
要求字典序最小,实际上我们求得就是一个最短路;
从中止状态反向遍历,就可以记录哪些点在起点到终点的最短路上。DP的状态就是最短路;
再从开始点开始,哪个状态在最短路上,就输出;
时间复杂度(n2);
我觉得吧,其实就是在这两个字符串上找到最短的公共子串(感性理解,实际上并不是这个意思),我们要匹配到n+1,m+1,一个串结束了,并不代表状态的结束;
因为当前状态+0/1可能还是较长串的子序列;
当我们匹配到n+1,m+1的时候就是最短非公共子序列;
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
int n,m;
char s[maxn],t[maxn]; int nxt_s[maxn][],nxt_t[maxn][]; int dp[maxn][maxn]; int on_road[maxn][maxn]; int main()
{
scanf("%d%d",&n,&m);
scanf("%s%s",s+,t+);
nxt_s[n+][]=nxt_s[n+][]=n+;
for(int i=n;i>=;i--)
{
int c=s[i]-'';
nxt_s[i][c]=i;
nxt_s[i][c^]=nxt_s[i+][c^];
}
nxt_t[m+][]=nxt_t[m+][]=m+;
for(int i=m;i>=;i--)
{
int c=t[i]-'';
nxt_t[i][c]=i;
nxt_t[i][c^]=nxt_t[i+][c^];
} memset(dp,0x3f,sizeof(dp));
dp[][]=;
for(int i=;i<=n+;i++)
{
for(int j=;j<=m+;j++)
{
for(int c=;c<;c++)
{
int x=i<=n?nxt_s[i+][c]:i;
int y=j<=m?nxt_t[j+][c]:j;
if(dp[x][y]>dp[i][j]+)
{
dp[x][y]=dp[i][j]+;
}
}
}
} on_road[n+][m+]=;
for(int i=n+;i>=;i--)
{
for(int j=m+;j>=;j--)
{
for(int c=;c<;c++)
{
int x=i<=n?nxt_s[i+][c]:i;
int y=j<=m?nxt_t[j+][c]:j;
if(dp[x][y]==dp[i][j]+&&on_road[x][y])
{
on_road[i][j]=;
}
}
}
} int i=,j=; while(i<=n||j<=m)
{
for(int c=;c<;c++)
{
int x=(i<=n?nxt_s[i+][c]:i);
int y=(j<=m?nxt_t[j+][c]:j);
if(dp[x][y]==dp[i][j]+&&on_road[x][y])
{
putchar(c+'');
i=x;j=y;
break;
}
}
} return ;
}
2019.10.25字符串——zr的更多相关文章
- Selenium对浏览器支持的版本【2019/10/25更新】
最新的selenium与几种常用浏览器的版本兼容情况:(以下驱动,点击直接跳转官方下载地址) 尽量选择最新版本-1的浏览器,比如最新的是60,那就使用59.(建议Chrome更新至72+版本.Fire ...
- 2019.10.25 csp-s模拟测试87 反思总结
一次非常神奇的考试,考完试以后看着T2的0pts突然笑死我自己 太智障了这什么神奇的题意理解错误23333 T1一眼分类讨论,两眼二分,觉得分类讨论有点玄学但是出题人八成不会卡[何],然后本着对二分的 ...
- 2019.10.25 csp-s模拟测试86 反思总结
继续存档 早上来补了一下昨天的题,不过肯定这两天的没法完全补起来 T1: 经典思路:关于位运算的题讨论每一位的贡献 #include<iostream> #include<cstdi ...
- Alpha冲刺(2/10)——2019.4.25
所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(2/10)--2019.4.25 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...
- [2019.03.25]Linux中的查找
TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...
- TIZ_c 第0周总结(2019/10/15-2019/10/22)工欲善其事必先利其器
TIZ_c 第0周总结(2019/10/15-2019/10/22)工欲善其事必先利其器 任务清单 给自己取一个酷酷的id,并选择1-2个喜欢的方向.(只是初步选择,后期可更改) 改下群名片.例如yo ...
- Java习题10.25
Java习题10.25 1. 实际上这道题考查的是两同两小一大原则: 方法名相同,参数类型相同 子类返回类型小于等于父类方法返回类型, 子类抛出异常小于等于父类方法抛出异常, 子类访问权限大于等于父类 ...
- 背水一战 Windows 10 (25) - MVVM: 通过 x:Bind 实现 MVVM(不用 Command)
[源码下载] 背水一战 Windows 10 (25) - MVVM: 通过 x:Bind 实现 MVVM(不用 Command) 作者:webabcd 介绍背水一战 Windows 10 之 MVV ...
- /proc/interrupts 统计2.6.38.8与3.10.25差异
eth4进,eth5出 linux-3.10.25 67: 2 3 2 3 PCI-MSI-edge eth468: ...
随机推荐
- docker 入坑4
搭建mongodb $ docker run --name mongo -it -d -p : -v ~/docker-data/mongo:/data/db -e MONGO_INITDB_ROOT ...
- Java Web 深入分析(12) JVM(2) 垃圾收集与内存分配
前言 java的内存分配和垃圾回收往往是影响系统性能和并发能力的主要因素,虚拟机提供许多的参数就是为了根据不同环境和请教下进行调优,没有最好的调优也没有固定的调优.需要我们深入的去了解jvm的各个垃圾 ...
- 易百教程人工智能python修正-人工智能数据准备-预处理数据
预处理数据 在我们的日常生活中,需要处理大量数据,但这些数据是原始数据. 为了提供数据作为机器学习算法的输入,需要将其转换为有意义的数据. 这就是数据预处理进入图像的地方. 换言之,可以说在将数据提供 ...
- 第二章:jQuery初探
一.引入jQuery XXXX.js文件 <script>标签 1.版本选择 当前jQuery有两个分支 1.x 支持ie6.7.8 jquery-1.11.2.js:未经过压缩,适合同学 ...
- js 算法,判断一个数组中的数字出现多少次
let arr = [11, 11, 2, 2, 5, 5, 5, 5, 3]; //创建一个map,把每个数字和其个数相对应 let countObj = {}; for (i = 0; i < ...
- CSS是什么
css是层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言. CSS不 ...
- python爬虫 urllib模块url编码处理
案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦'的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...
- Redis数据结构和使用场景,redis内存淘汰策略
什么样的数据适合放入Redis? sql执行耗时特别久,且结果不频繁变动的数据,适合放入Redis. Redis是单线程的,为什么会这么快? 纯内存操作 单线程操作,避免频繁的上下文切换 采用了非阻塞 ...
- 学习python的日常7
---恢复内容开始--- 正则表达式: 在正则表达式中,用\d可以匹配一个数字,\w可以匹配一个字母或数字,'.'可以匹配任意字符,用*表示任意个字符,用+表示至少一个字符,用?表示0个货一个字符,用 ...
- ymPrompt简介
ymPrompt从最简单的1.0版本到现在的4.0版本,代码共经历了四次较大的改动,组件在功能上有了很大的改进,应用灵活度更大,可应用环境的环境更加广泛,特别在4.0版本中加入对遮罩显示隐藏.按钮/图 ...