1006
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。

比如两个串为:
 
abcicba
abdkscab
 
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
 

输入

  1. 1行:字符串A
  2. 2行:字符串B
  3. (A,B的长度 <= 1000)

输出

  1. 输出最长的子序列,如果有多个,随意输出1个。

输入样例

  1. abcicba
  2. abdkscab

输出样例

  1. abca
  2.  
  3. 解:dp题,画一画表格可以帮助理解。
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. #define CLR(x) memset(x, 0, sizeof x)
  5. #define MAX(a,b) (a > b ? a : b)
  6.  
  7. char a[], b[],c[];
  8. int dp[][];
  9.  
  10. int main()
  11. {
  12. while (scanf_s("%s%s", a,, b,) != EOF)
  13. {
  14. int lena = strlen(a),lenb=strlen(b);
  15. for (int i = ; i <= lena; i++)
  16. {
  17. for (int j = ; j <= lenb; j++)
  18. {
  19. if (a[i - ] == b[j - ]) dp[i][j] = dp[i - ][j - ] + ;
  20. else dp[i][j] = MAX(dp[i - ][j], dp[i][j - ]);
  21. }
  22. }
  23. for (int i = dp[lena][lenb],j = ; i > ;)
  24. {
  25. if (dp[lena][lenb] > dp[lena - ][lenb]&& dp[lena][lenb] > dp[lena][lenb - ])
  26. {
  27. c[i-]=a[lena - ];
  28. lena--; lenb--;
  29. i--;
  30. }
  31. else
  32. {
  33. int mode = dp[lena - ][lenb]>dp[lena][lenb - ] ? :;
  34. if (mode) lena--;
  35. else lenb--;
  36. }
  37. }
  38. printf("%s\n",c);
  39. }
  40. }

1092

回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。每个字符串都可以通过向中间添加一些字符,使之变为回文字符串。
例如:abbc 添加2个字符可以变为 acbbca,也可以添加3个变为 abbcbba。方案1只需要添加2个字符,是所有方案中添加字符数量最少的。
 

输入

  1. 输入一个字符串StrStr的长度 <= 1000

输出

  1. 输出最少添加多少个字符可以使之变为回文字串。

输入样例

  1. abbc

输出样例

  1. 2
  2.  
  3. 解:求最长字符串的变形。针对上一题的做法优化了一下空间复杂度。
  1. #include<stdio.h>
  2. #include<string.h>
  3. #define Max(a,b) ((a)>(b)?(a):(b))
  4. char a[];
  5. int dp[][];
  6. int main()
  7. {
  8. while (scanf_s("%s", a, ) != EOF)
  9. {
  10. int len = strlen(a), ans, tmp = ;
  11. memset(dp, , sizeof dp);
  12. for (int i = ; i < len; ++i)
  13. {
  14. for (int j = len - ; j >= ; --j)
  15. {
  16. if (a[i] == a[j]) dp[tmp][j] = dp[tmp ^ ][j + ] + ;
  17. else dp[tmp][j] = Max(dp[tmp ^ ][j], dp[tmp][j + ]);
  18. }
  19. tmp ^= ;
  20. }
  21. ans = len - dp[tmp ^ ][];
  22. printf("%d\n", ans);
  23. }
  24. return ;
  25. }

(DP)51NOD 1006 最长公共子序列&1092 回文字符串的更多相关文章

  1. 51nod 1006 最长公共子序列Lcs 【LCS/打印path】

    1006 最长公共子序列Lcs  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

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

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

  3. 51nod 1006 最长公共子序列Lcs(经典动态规划)

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

  4. 51Nod - 1006 最长公共子序列Lcs模板

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

  5. 51Nod 1006 最长公共子序列Lcs问题 模板题

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

  6. 【模板】51nod 1006 最长公共子序列Lcs

    [题解] dp转移的时候记录一下,然后倒着推出答案即可. #include<cstdio> #include<cstring> #include<algorithm> ...

  7. 1006 最长公共子序列Lcs

    1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...

  8. 51nod 1092 回文字符串【LCS】

    1092 回文字符串 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串.每个字符 ...

  9. 51 Nod 1092 回文字符串

    1092 回文字符串  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串.每 ...

随机推荐

  1. IOS7 开发注意事项

    1,修改状态栏的样式和隐藏. 首先,需要在Info.plist配置文件中,增加键:UIViewControllerBasedStatusBarAppearance,并设置为YES: 然后,在UIVie ...

  2. C开发人员眼中的SICP学习

    谈谈自己看SICP的一些体会 第一章  构造过程抽象 这一章事实上和C语言全然等价, 不打算深入学习LISP的能够高速略过. 思想上没有太多新的东西. 这一章最核心的价值就是以下3句话, 理解了这一章 ...

  3. java设计模式----复合模式

    复合模式:复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题 要点: 1.MVC是复合模式,结合了观察者模式.策略模式和组合模式 2.模型使用观察者模式,以便观察者更新,同时保持 ...

  4. 翻译:A Tutorial on the Device Tree (Zynq) -- Part V

    A Tutorial on the Device Tree (Zynq) -- Part V Application-specific data 之前提过,设备树中是一些特殊信息,这样一个驱动可以管理 ...

  5. ubuntu git ssh不通

    xyh@ubuntu-64:~$ ssh -v git@danxinben.com                                                            ...

  6. CentOS笔记-磁盘管理

    Linux磁盘管理常用三个命令为df.du和fdisk. df:列出文件系统的整体磁盘使用量 du:检查磁盘空间使用量 fdisk:用于磁盘分区 df [-ahikHTm] [目录或文件名] -a : ...

  7. 6.游戏特别离不开脚本(4)-应该避免将集合框架对象传给JS

    java map  传给 javascript 不是自动关联的,最好别传啊,遍历起来也麻烦(尽量避开集合框架吧),用数组或者自建一个对象.这里虽然有种方法: // build a Map Map< ...

  8. FLTK 简介

          FLTK,如同其名字所表达的:The Fast Light Tool Kit,一个轻量级的GUI开发库.但这轻量级并不代表功能的羸弱,相反,FLTK在具有基本的GUI功能之外,还拥有一些特 ...

  9. (31)java web的hibernate使用-一级缓存,二级缓存

    参考:https://blog.csdn.net/miachen520/article/details/52195832 hibernate自带一级缓存 和 二级缓存 一,一级缓存: 基于Sessio ...

  10. js对闭包的理解

    原文链接http://www.jb51.net/article/24101.htm,讲的很好,清晰明了.