题目链接:https://vjudge.net/contest/225715#problem/B

转载于>>>

题目大意:

给出两个序列,要求输出它们的最长公共子序列。

解题思路:

最长公共子序列模板题~

我们用dp[i][j]表示到a串第i个字符, b串第j个字符的最大匹配字符数,那么状态转移方程为:

  1. dp[i][j]=dp[i-][j-]+ a[i]==b[j]
  2.  
  3. dp[i][j]=max(dp[i][j-], dp[i-][j]) a[i]!=b[j]

我们可以这样理解:dp[i][j]表示第a串前i个字符与b串前j个字符的最大匹配数,dp[i-1][j-1]表示a字符前i-1个字符与b串前j-1个字符的最大匹配数

如果a[i]=b[j],那么很明显dp[i][j]=dp[i-1][j-1]+1;

若a[i]!=b[j],我们假设a, b的最大匹配串为c,显然a[i], b[j]不能同时作为c的最后一个字符,那么最优匹配情况即为a[i]为c的最后一个字符或者b[j]为c的最后一个字符(这点不大好理解),即

dp[i][j]=dp[i][j-1]    a[i]是c的最后一个字符即匹配的末尾字符

dp[i][j]=dp[i-1][j]    b[j]是c的最后一个字符即匹配的末尾字符 (其实当a[i], b[j]都不是c的最后一个字符时即a[i], b[j]都不匹配时dp[i][j]=dp[i-1][j-1])

又dp要取最大值 ,即dp[i][j]=max(dp[i][j-1], dp[i-1][j])

题目还要求要输出一个最优匹配串,这个我们用vis[][]数组在dp过程中记录一下路径就好啦~

非递归输出路径

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define MAXN 1010
  4. int dp[MAXN][MAXN];
  5. int vis[MAXN][MAXN];
  6. string stra, strb;
  7. char output[MAXN]; int cur = ;
  8.  
  9. void getlcs(int i, int j)
  10. {
  11. while (i>&&j>) //逆推取出vis中保存的路径
  12. {
  13. if (vis[i][j]==) {
  14. output[cur++] = stra[i - ];
  15. i--; j--;
  16. }
  17. else if (vis[i][j] == ) {
  18. j--;
  19. }
  20. else {
  21. i--;
  22. }
  23. }
  24. }
  25.  
  26. int main()
  27. {
  28. cin >> stra >> strb;
  29. int lena = stra.length();
  30. int lenb = strb.length();
  31. for (int i = ; i <= lena; i++){
  32. for (int j = ; j <= lenb; j++) {
  33. if (stra[i - ] == strb[j - ]) {
  34. dp[i][j] = dp[i - ][j - ] + ;
  35. vis[i][j] = ; //vis数组标记路径
  36. }
  37. else {
  38. if (dp[i - ][j] < dp[i][j - ]) {
  39. dp[i][j] = dp[i][j - ];
  40. vis[i][j] = ;
  41. }
  42. else {
  43. dp[i][j] = dp[i - ][j];
  44. vis[i][j] = ;
  45. }
  46. }
  47. }
  48. }
  49. getlcs(lena, lenb);
  50. for (int i = cur - ; i >= ; i--) //逆向输出
  51. printf("%c", output[i]);
  52. cout << endl;
  53. return ;
  54. }

递归输出路径

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define MAXN 1010
  4. int dp[MAXN][MAXN];
  5. int vis[MAXN][MAXN];
  6. string stra, strb;
  7.  
  8. void getlcs(int i, int j) { //**输出路径
  9. if (!i || !j) { //因为i-1要>=0
  10. return;
  11. }
  12. if (vis[i][j] == ) {
  13. getlcs(i - , j - );
  14. printf("%c", stra[i - ]);
  15. }
  16. else if (vis[i][j] == ) {
  17. getlcs(i, j - );
  18. }
  19. else {
  20. getlcs(i - , j);
  21. }
  22. }
  23.  
  24. int main()
  25. {
  26. cin >> stra >> strb;
  27. int lena = stra.length();
  28. int lenb = strb.length();
  29. for (int i = ; i <= lena; i++){
  30. for (int j = ; j <= lenb; j++) {
  31. if (stra[i - ] == strb[j - ]) {
  32. dp[i][j] = dp[i - ][j - ] + ;
  33. vis[i][j] = ; //vis数组标记路径
  34. }
  35. else {
  36. if (dp[i - ][j] < dp[i][j - ]) {
  37. dp[i][j] = dp[i][j - ];
  38. vis[i][j] = ;
  39. }
  40. else {
  41. dp[i][j] = dp[i - ][j];
  42. vis[i][j] = ;
  43. }
  44. }
  45. }
  46. }
  47. getlcs(lena, lenb);
  48. cout << endl;
  49. return ;
  50. }

2018-05-18

51Nod-1006【LCS】+【输出路径】模板题的更多相关文章

  1. LCS以及输出路径模板

    记忆 两个for用来寻找LCS,DP是二维的,每一维代表了字符串的长度. 寻找的代码部分 if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][ ...

  2. 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...

  3. hdu 1503 Advanced Fruits(LCS输出路径)

    Problem Description The company "21st Century Fruits" has specialized in creating new sort ...

  4. hdu 1503 LCS输出路径【dp】

    hdu 1503 不知道最后怎么输出,因为公共部分只输出一次.有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左 ...

  5. 51nod 矩阵快速幂(模板题)

    1113 矩阵快速幂  基准时间限制:3 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大 ...

  6. Educational DP Contest F - LCS (LCS输出路径)

    题意:有两个字符串,求他们的最长公共子序列并输出. 题解:首先跑个LCS记录一下dp数组,然后根据dp数组来反着还原路径,只有当两个位置的字符相同时才输出. 代码: char s[N],t[N]; i ...

  7. poj 2007 凸包构造和极角排序输出(模板题)

    Scrambled Polygon Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10841   Accepted: 508 ...

  8. Alice拜年 模板题 /// 最短路Dijk oj1344

    题目大意: 大年初一,Alice带上拜年礼物去给N-1位亲朋好友长辈拜年,亲友真多啊,是个大家族.由于Alice才2岁,力气不大,每次只能拿一份礼物,拜完年之后,要回家取第二份礼物,然后去下一家拜年( ...

  9. PAT甲题题解-1030. Travel Plan (30)-最短路+输出路径

    模板题最短路+输出路径如果最短路不唯一,输出cost最小的 #include <iostream> #include <cstdio> #include <algorit ...

随机推荐

  1. Wannafly挑战赛17D 01序列2

    传送门 先考虑二进制下为3倍数的数的共同特点自己手玩去,可以发现这些数奇数二进制位上的1个数(记为\(a\))和偶数二进制位上的1个数(记为\(b\))在模3意义下相等(\(a \equiv b (m ...

  2. transform,变换

    1.transform属性:rotate(翻转),skew(倾斜),scale(缩放),translate(移位) 用法:transform: rotate(45deg) scale(0.5) ske ...

  3. Jetson tk1 安装 Intel 7260 无线网卡驱动

    Jseton TK1上没有集成的无线网卡,开发板上有一个mini pci-e接口,可以插入Intel 7260这款继承了wifi和蓝牙功能的无线网卡: 该网卡实物如下图,在淘宝和Amazon上都可以买 ...

  4. python3之redis

    1.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...

  5. 【转】Python之函数与变量

    [转]Python之函数与变量 本节内容 函数介绍及其作用 函数的定义与调用 函数的参数说明 变量与作用域 值传递和引用传递 一.函数的介绍及其作用 编程语言中的函数与数学中的函数是有区别的:数学中的 ...

  6. ARMV8 datasheet学习笔记3:AArch64应用级体系结构之Memory Type and Attributes

    1.前言 2. Memory类型和属性 memory分为normal memory和device memory,两种类型的Memory有各自的属性,除了下面介绍的几种属性外,还有其他一些杂项属性 2. ...

  7. sqlserver 备份 与 还原

    背景 真是够懒得,一看这个内容,如此简单.当时的想法就是网上教程一堆,全记下来有啥意思,只是记录了要点.不过写到这里,也就写个别的吧.sqlserver与Oracle比起来,我感觉有个重要差距就是存储 ...

  8. selenium python2.7安装配置

    1:安装python python2.7版本(最新的python版本是3.4,但用户体验没有2.7版本的好,我们选择用2.7版本) 下载地址:https://www.python.org/downlo ...

  9. url传参中文乱码解决

    url传参request.setCharacterEncoding("utf-8");无法解决中文乱码问题 解决方法: 修改tomcat---conf----server.xml文 ...

  10. 求阶乘的和(for循环)

    第二种方法: