这个题目求某个字符串中含的最长的回文子串。

就是一个很简单的LCS模型吗,而且我不明白为什么网上这么多人都说仿照某写法把字符串先逆序一下,然后求LCS,我只想问一下,有必要吗?

直接按LCS的套路来就行了啊,只不过方式变了下,按上面的写法,又麻烦,又根本没利用的LCS的精髓思想

即,先从间隔0位开始做起,然后是间隔1位。。2.。。n-1位,d[i][j]代表i到j的最长回文串个数

于是就有 s[i]==s[j] d[i][j]=d[i+1][j-1]+2,否则就取 max(f[i+1][j],f[i][j-1]),不就行啦。还用得着上面那样搞?

不过如果这个问题这么简单我也不会放到博客里来写了。主要是下面的问题,我还确实一开始没想到。

比较麻烦的是当出现多个情况的时候 输出字典序小的,我一开始没想谨慎,很快的敲了,用个数组直接记录子串的字母的ASCII码值和,比较这个和来确定字典序,后来WA了几次才醒悟,这里肯定不能简单求ASCII和啊,比如 一个字符串里同时存在 adda和bccb,按我的做法,不是任意输出一个都行、、、显然不对嘛

所以这个还是直接在计算的过程中,就把字符串求出来比较好,即按上面的推法,如果s[i]==s[j],把s[i]+已有回文串+s[j]组成新串即可,但是有个问题是,没有字符串函数是可以进行字符串的连接重组的,难道手写?还好C++的string是很强大的,直接可以进行+操作,并且可以直接进行比值,比出来直接就是字典序,那简直方便得不得了啊。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <string>
  5. #define INF 1<<30
  6. using namespace std;
  7. int d[][];
  8. double cnt[][];
  9. string str[][];
  10. char s[];
  11. int len;
  12. //void print(int l,int r)
  13. //{
  14. // if (l>r) return;
  15. // if (s[l]==s[r])
  16. // {
  17. // printf("%c",s[l]);
  18. // print(l+1,r-1);
  19. // if (l<r)
  20. // printf("%c",s[r]);
  21. // return;
  22. // }
  23. // if (d[l+1][r]>d[l][r-1])
  24. // {
  25. // print(l+1,r);
  26. // return;
  27. // }
  28. // if (d[l+1][r]<d[l][r-1])
  29. // {
  30. // print(l,r-1);
  31. // return;
  32. // }
  33. // if (d[l+1][r]==d[l][r-1])
  34. // {
  35. // if (cnt[l+1][r]<cnt[l][r-1])
  36. // {
  37. // print(l+1,r);
  38. // }
  39. // else
  40. // print(l,r-1);
  41. // }
  42. //
  43. //}
  44. int main()
  45. {
  46. while (scanf("%s",&s)!=EOF)
  47. {
  48. len=strlen(s);
  49. memset(d,,sizeof d);
  50. // memset(cnt,0,sizeof cnt);
  51. for (int i=;i<len;i++)
  52. {
  53. for (int j=;j+i<len;j++)
  54. {
  55. int k=j+i;
  56. int chj=s[j];
  57. int chk=s[k];
  58. if (s[j]==s[k])
  59. {
  60. if (i==)
  61. {
  62. d[j][k]=;
  63. str[j][k]=s[j];
  64. }
  65. else{
  66. d[j][k]=d[j+][k-]+;
  67. str[j][k]=s[j]+str[j+][k-]+s[k];
  68. }
  69. }
  70. else
  71. {
  72. if (d[j][k-]>d[j+][k])
  73. {
  74. d[j][k]=d[j][k-];
  75. str[j][k]=str[j][k-];
  76. }
  77. else
  78. if (d[j][k-]<d[j+][k])
  79. {
  80. d[j][k]=d[j+][k];
  81. str[j][k]=str[j+][k];
  82. }
  83. else
  84. if (d[j][k-]==d[j+][k])
  85. {
  86. d[j][k]=d[j+][k];
  87. if (str[j][k-]<str[j+][k]) //直接string进行比值操作就可知道字典序大小
  88. str[j][k]=str[j][k-];
  89. else
  90. str[j][k]=str[j+][k];
  91. }
  92. }
  93. }
  94. }
  95. cout<<str[][len-]<<endl;//直接输出该string即可
  96. //print(0,len-1);
  97. //printf("\n");
  98. }
  99. return ;
  100. }

UVA 11404 简单LCS模型DP 字典序比较的更多相关文章

  1. 【UVa】Palindromic Subsequence(dp+字典序)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=s ...

  2. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  3. uva 11404 dp

    UVA 11404 - Palindromic Subsequence 求给定字符串的最长回文子序列,长度一样的输出字典序最小的. 对于 [l, r] 区间的最长回文串.他可能是[l+1, r] 和[ ...

  4. UVA.10066 The Twin Towers (DP LCS)

    UVA.10066 The Twin Towers (DP LCS) 题意分析 有2座塔,分别由不同长度的石块组成.现在要求移走一些石块,使得这2座塔的高度相同,求高度最大是多少. 问题的实质可以转化 ...

  5. 【UVA 11404】Palindromic Subsequence

    UVA 11404 我用了最暴力的做法:考虑\(dp[i][j]\)表示\(S[i..j]\)的最长回文子序列的长度以及字典序最小的那个. 然后转移的时候如下处理:首先\(dp[i][j]\)要取\( ...

  6. LPS UVA 11404 Palindromic Subsequence

    题目传送门 题意:求LPS (Longest Palidromic Subsequence) 最长回文子序列.和回文串不同,子序列是可以不连续的. 分析:1. 推荐->还有一种写法是用了LCS的 ...

  7. UVA 11404 五 Palindromic Subsequence

     Palindromic Subsequence Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu ...

  8. UVA 10003 Cutting Sticks 区间DP+记忆化搜索

    UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...

  9. 炸金花游戏(3)--基于EV(期望收益)的简单AI模型

    前言: 炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI. 相关文章: 德州扑克AI--Prog ...

随机推荐

  1. POJ 1256:Anagram

    Anagram Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18393 Accepted: 7484 Description ...

  2. 批量处理文件的Python程序

    经常批量处理文件,这里有个python的模板,保存一下 这个例子是把目录里面所有子目录的mp3文件放慢0.85倍并保存到./processed/目录下面. #coding=utf-8 import s ...

  3. Sass - &引用父选择器

    描述: 您可以使用&字符选择父级选择器. 它告诉父选择器应该插入的位置. 例一:&在前 h3 { font-size: 20px margin-bottom: 10px &.s ...

  4. iptable实现端口转发

    利用iptables的规则来实现端口转发: 第一步需要将内核参数的net.ipv4.ip_forward=1 场景一:实现本地端口转发 本地端口转发实在PREROUTING链中将端口做NAT转换: # ...

  5. CentOS 6.8 32位 安装mysql8

    1.清理掉之前安装过的mysql rpm -qa | grep mysql mysql-libs-5.1.52-1.el6_0.1.x86_64 yum remove mysql-libs-5.1.5 ...

  6. MySQL每日执行

    drop event if exists upload_deadline; DELIMITER $$ create event upload_deadline day starts timestamp ...

  7. mcu运行时间估算

    昨个伙计问我他那个板子的程序运行时间估算问题… 现在说一下估算的思路.首先确定有几个点,板子的主频.时钟周期,机器周期. 首先由主频f得到一个时钟周期为1/f. 再者时钟周期与机器周期有一个比例关系, ...

  8. 064-PHP函数中局部变量在函数外不可使用

    <?php function print_num(){ //定义函数 $x=6; //在函数中定义变量 } print_num(); //调用函数 echo $x; ?>

  9. Android Studio真机调试安装以后打开闪退,打包APK再安装正常打开没有问题

    一直真机调试都没有问题, 但是有一次开始,真机调试正常安装没有问题,但是一打开就崩溃了一眨眼间就像被光闪了一下的那种. oppoR11调试会这样,但是用魅族试过没有问题, 报错出现过Android S ...

  10. 如何下载安装python安装包

    1.从360搜索python,找到“python官网”              python官网地址:https://www.python.org/ 2.进入python官网,出现下面的页面 3.点 ...