CF346B Lucky Common Subsequence 题解
CF346B Lucky Common Subsequence 题解
题目链接:CF346B Lucky Common Subsequence
题意:通过删除一个字符串中的某些元素而不改变其余元素的顺序,可以派生出该字符串的一个子序列。 例如,序列BDF是ABCDEF的子序列。 字符串的子字符串是该字符串的连续子序列。 例如,BCD是ABCDEF的子串。 你得到了两个字符串s1,s2和另一个名为virus的字符串。你的任务是找到s1和s2的最长公共子序列,同时不包含virus子字符串。
升级版的最长公共子序列问题(LCS问题)
考虑增加一维,称为与 ccc 串匹配度,即
dp[i][j][k]dp[i][j][k]dp[i][j][k] 表示:
aaa 串匹配到第 iii 位,bbb 串匹配到第 jjj 位最长公共子序列与 ccc 串匹配到第 kkk 位。
显然当 a[i]≠b[j]a[i]\ne b[j]a[i]=b[j] 时,有 dp[i][j][k]=max(dp[i][j][k],dp[i][j−1][k],dp[i−1][j][k])dp[i][j][k]=\max(dp[i][j][k],dp[i][j-1][k],dp[i-1][j][k])dp[i][j][k]=max(dp[i][j][k],dp[i][j−1][k],dp[i−1][j][k])
当 a[i]=b[j]a[i]=b[j]a[i]=b[j] 时,直接去想 dp[i][j][k]dp[i][j][k]dp[i][j][k] 怎么转移不太好搞
考虑反过来想此时 dp[i−1][j−1][k]dp[i-1][j-1][k]dp[i−1][j−1][k] 的贡献
显然此时在最长公共子序列上增加一个 a[i]a[i]a[i] ,可能会改变匹配的程度
设加上 a[i]a[i]a[i] 后的最长公共子序列与 ccc 串匹配到第 ppp 位
则有 dp[i][j][p]=dp[i][j][p],dp[i−1][j−1][k]+a[i]dp[i][j][p] = dp[i][j][p],dp[i-1][j-1][k]+a[i]dp[i][j][p]=dp[i][j][p],dp[i−1][j−1][k]+a[i]
注意到这个 ppp 可以通过跳fail数组得到,考虑KMP
则时间复杂度 O(n3)O(n^3)O(n3)
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N (int)(115)
int la,lb,lc;
char a[N],b[N],c[N];
string dp[N][N][N];
int fail[N];
void proc(string &a,string b)
{if(a.size()<b.size())a=b;
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// freopen("check.in","r",stdin);// freopen("check.out","w",stdout);scanf("%s%s%s",a+1,b+1,c+1);la=strlen(a+1);lb=strlen(b+1);lc=strlen(c+1);for(int i=2,j=0; i<=lc; i++){while(j>0&&c[i]!=c[j+1])j=fail[j];if(c[i]==c[j+1])++j;fail[i]=j;}for(int i=1; i<=la; i++)for(int j=1; j<=lb; j++)for(int k=0; k<lc; k++){if(a[i]==b[j]){char ch=a[i];int p=k;while(p>0&&ch!=c[p+1])p=fail[p];if(ch==c[p+1])++p;proc(dp[i][j][p],dp[i-1][j-1][k]+ch);}proc(dp[i][j][k],dp[i][j-1][k]);proc(dp[i][j][k],dp[i-1][j][k]);}string res;for(int i=0; i<lc; i++)proc(res,dp[la][lb][i]);if(res.empty())puts("0");else printf("%s\n",res.c_str());return 0;
}
转载请说明出处
CF346B Lucky Common Subsequence 题解相关推荐
- 动态规划—最长公共子序列问题 HDU-1159 Common Subsequence
动态规划-最长公共子序列问题 Common Subsequence [ HDU - 1159 ] A subsequence of a given sequence is the given sequ ...
- HD 1159 Common Subsequence (最长公共子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Problem Description A subsequence of a given seq ...
- C++longest common subsequence最长公共子序列的实现(附完整源码)
C++longest common subsequence最长公共子序列 longest common subsequence最长公共子序列的完整源码(定义,实现,main函数测试) longest ...
- Common Subsequence
原题及翻译 A subsequence of a given sequence is the given sequence with some elements (possible none) lef ...
- HDU 1159.Common Subsequence【动态规划DP】
Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...
- HDU 1159 Common Subsequence 动态规划
2017-08-06 15:41:04 writer:pprp 刚开始学dp,集训的讲的很难,但是还是得自己看,从简单到难,慢慢来(如果哪里有错误欢迎各位大佬指正) 题意如下: 给两个字符串,找到其中 ...
- 【算法导论学习-29】动态规划经典问题02:最长公共子序列问题(Longest common subsequence,LCS)...
2019独角兽企业重金招聘Python工程师标准>>> 问题描述:序列X={x1,x2,-,xn},Y={y1,y2,-,yn},当Z={z1,z2-,zn}是X的严格递增下标顺序( ...
- UVA10405 Longest Common Subsequence【LCS+DP】
Given two sequences of characters, print the length of the longest common subsequence of both sequen ...
- 最长公共子串LCS (Longest Common Subsequence) 算法
三个方法都有所借鉴,但代码部分是自己试着写出来的,虽然最后的运行结果都是正确的,但此过程中难免会有考虑不周全的地方,如发现代码某些地方有误,欢迎指正.同时有新的想法,也可以提出! 采用顺序结构存储串, ...
最新文章
- pythonweb开发-5个最好的Python Web开发框架
- preg_match_all用法
- Ubuntu安装qwt步骤
- JSP表单提交中文乱码解决方案
- java控制台五子棋游戏
- 推荐 :深度学习初学者不可不知的25个术语和概念(上)
- CSS中伪类选择器及伪元素
- 学子商城代码2(项目 第十六阶段)
- 没有提取码 php云盘文件,最新百度网盘分享文件链接无需提取码的方法
- c语言随机抽号小程序源代码,使用JS编写的随机抽取号码的小程序
- android中生成 PDF,Android PDF生成
- 抽象类与接口的异同点
- linux文件夹内JPG批量转PNG
- 飞桨OCR打标、训练、预测、部署全流程
- 用python实现二分法求平方根_二分法求平方根(Python实现)
- flv.js php,flv.js的使用详解
- 使用python爬取网站数据并写入到excel中
- memcpy函数(多积累进大厂)
- 二层网络的未来?starkgate 带你体验二层桥接
- 数据加载、存储与文件格式(python)
热门文章
- 自动抠图,一个细致都透明头发丝都能抠出来的开源项目
- 一个程序员眼中的北京和上海
- web应用防火墙的作用
- 浅谈防火墙五个域,三种模式
- 计算机组装模拟网址,装机模拟器PC Building Simulator-电玩之家
- 从源码角度拆解SpringSecurity之C位的AuthenticationManager
- matlab对比图曲线,用于数据拟合,图像对比的MATLAB作图命令PLOTYY
- php 打印curl请求的header信息和返回的header信息
- 停车场管理系统python_python实现停车管理系统
- 方便业务迁移,大型企业数据中心技术,学SDN必备的VXLAN大二层基础