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: ...
随机推荐
- C++使用代码创建一个Windows桌面应用程序
WinMain函数 Windows应用程序的唯一程序入口. 函数原型 int WINAPI WinMain { HINSTANCE hInstancem HINSTANCE hPreInstance, ...
- 监听EF执行的sql语句及状态
1.监听EF执行sql的方式 db.Database.Log += c => Console.WriteLine($"sql:{c}"); SQL Server Profil ...
- 14-4 ADO.NET简介
微软数据访问方式历史阶段 ①ODBC(Open Database Connectivity)是第一个使用SQL访问不同关系数据库的访问技术.使用ODBC应用程序能够通过单一的命令操作不同的数据库,而开 ...
- PKPM BIMViewer的使用
模型的使用,目前有两个方案, 一个是使用全局组件,在单页面的主页面中进行嵌套 <template> <div id="model"> <!-- 这样的 ...
- 修复win10系统的引导
上周末时,在安装完linux后,进入win10系统后,想做个系统的引导菜单,用了easyBCD,后来一不小心删除了win10的引导菜单(window boot manager). 这样,就造成了我wi ...
- JavaScript,数组,方法;
JavaScript,数组除了常见的增删查改,其他的方法也有很多. let arr = [1, 3, 7, 6, 9, 4, 6, 2]; 1:every方法, 对数组进行遍历,每个元素都满足条件时, ...
- PHP 结合 Bootstrap 实现学生列表以及添加学生功能实现(继上篇登录及注册功能之后)
本人是一位学生,正在学习当中,可能BUG众多,请见谅并指正,谢谢!!! 学生列表实现 HTML: <!DOCTYPE html> <html> <head> < ...
- SIM7600CE http post
SIM7600CE是一款SMT封装的模块,支持 LTE-TDD/LTE-FDD/HSPA+/TD-SCDMA/EVDO和GSM/GPRS/EDGE等频段,支持LTE CAT4(下行速度为150Mbps ...
- netcore里使用jwt做登陆授权
1 什么是JWT? JWT是一种用于双方之间传递安全信息的简洁的.URL安全的表述性声明规范.JWT作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象 ...
- tp5 修改配置参数 view_replace_str 无效
原因: 缓存问题 找到 thinkphp\library\think\Template.php 找到 public function fetch($template, $vars = [], $c ...