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 题解相关推荐

  1. 动态规划—最长公共子序列问题 HDU-1159 Common Subsequence

    动态规划-最长公共子序列问题 Common Subsequence [ HDU - 1159 ] A subsequence of a given sequence is the given sequ ...

  2. HD 1159 Common Subsequence (最长公共子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Problem Description A subsequence of a given seq ...

  3. C++longest common subsequence最长公共子序列的实现(附完整源码)

    C++longest common subsequence最长公共子序列 longest common subsequence最长公共子序列的完整源码(定义,实现,main函数测试) longest ...

  4. Common Subsequence

    原题及翻译 A subsequence of a given sequence is the given sequence with some elements (possible none) lef ...

  5. HDU 1159.Common Subsequence【动态规划DP】

    Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...

  6. HDU 1159 Common Subsequence 动态规划

    2017-08-06 15:41:04 writer:pprp 刚开始学dp,集训的讲的很难,但是还是得自己看,从简单到难,慢慢来(如果哪里有错误欢迎各位大佬指正) 题意如下: 给两个字符串,找到其中 ...

  7. 【算法导论学习-29】动态规划经典问题02:最长公共子序列问题(Longest common subsequence,LCS)...

    2019独角兽企业重金招聘Python工程师标准>>> 问题描述:序列X={x1,x2,-,xn},Y={y1,y2,-,yn},当Z={z1,z2-,zn}是X的严格递增下标顺序( ...

  8. UVA10405 Longest Common Subsequence【LCS+DP】

    Given two sequences of characters, print the length of the longest common subsequence of both sequen ...

  9. 最长公共子串LCS (Longest Common Subsequence) 算法

    三个方法都有所借鉴,但代码部分是自己试着写出来的,虽然最后的运行结果都是正确的,但此过程中难免会有考虑不周全的地方,如发现代码某些地方有误,欢迎指正.同时有新的想法,也可以提出! 采用顺序结构存储串, ...

最新文章

  1. pythonweb开发-5个最好的Python Web开发框架
  2. preg_match_all用法
  3. Ubuntu安装qwt步骤
  4. JSP表单提交中文乱码解决方案
  5. java控制台五子棋游戏
  6. 推荐 :深度学习初学者不可不知的25个术语和概念(上)
  7. CSS中伪类选择器及伪元素
  8. 学子商城代码2(项目 第十六阶段)
  9. 没有提取码 php云盘文件,最新百度网盘分享文件链接无需提取码的方法
  10. c语言随机抽号小程序源代码,使用JS编写的随机抽取号码的小程序
  11. android中生成 PDF,Android PDF生成
  12. 抽象类与接口的异同点
  13. linux文件夹内JPG批量转PNG
  14. 飞桨OCR打标、训练、预测、部署全流程
  15. 用python实现二分法求平方根_二分法求平方根(Python实现)
  16. flv.js php,flv.js的使用详解
  17. 使用python爬取网站数据并写入到excel中
  18. memcpy函数(多积累进大厂)
  19. 二层网络的未来?starkgate 带你体验二层桥接
  20. 数据加载、存储与文件格式(python)

热门文章

  1. 自动抠图,一个细致都透明头发丝都能抠出来的开源项目
  2. 一个程序员眼中的北京和上海
  3. web应用防火墙的作用
  4. 浅谈防火墙五个域,三种模式
  5. 计算机组装模拟网址,装机模拟器PC Building Simulator-电玩之家
  6. 从源码角度拆解SpringSecurity之C位的AuthenticationManager
  7. matlab对比图曲线,用于数据拟合,图像对比的MATLAB作图命令PLOTYY
  8. php 打印curl请求的header信息和返回的header信息
  9. 停车场管理系统python_python实现停车管理系统
  10. 方便业务迁移,大型企业数据中心技术,学SDN必备的VXLAN大二层基础