题目大意

给定一个字符串,要求你删除尽量少的字符,使得原字符串变为最长回文串,并把回文串输出,如果答案有多种,则输出字典序最小的

题解

有两种解法,第一种是把字符串逆序,然后求两个字符串的LCS,并记录LCS,长度就等于最长回文串的长度,不过求出来的LCS不一定是回文串,例如下面这个例子

  1. s = 1 5 2 4 3 3 2 4 5 1
  2. reverse(s) = 1 5 4 2 3 3 4 2 5 1
  3. LCS = 1 5 2 3 3 4 5 1
  1. 所以我们只需要LCS的前半段即可

代码:

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <string>
  4. #include <iostream>
  5. #include <utility>
  6. using namespace std;
  7. #define MAXN 1005
  8. string a,b;
  9. pair<int,string>dp[MAXN][MAXN];
  10. int main()
  11. {
  12. while(cin>>a)
  13. {
  14. int len=a.length();
  15. b=a;
  16. reverse(b.begin(),b.end());
  17. for(int i=0;i<len;i++)
  18. {
  19. dp[0][i].first=0,dp[0][i].second="";
  20. dp[i][0].first=0,dp[i][0].second="";
  21. }
  22. for(int i=0;i<len;i++)
  23. for (int j=0;j<len;j++)
  24. if(a[i]==b[j])
  25. {
  26. dp[i+1][j+1].first=dp[i][j].first+1;
  27. dp[i+1][j+1].second=dp[i][j].second+a[i];
  28. }
  29. else
  30. {
  31. if(dp[i+1][j].first>dp[i][j+1].first)
  32. {
  33. dp[i+1][j+1].first=dp[i+1][j].first;
  34. dp[i+1][j+1].second=dp[i+1][j].second;
  35. }
  36. else
  37. if(dp[i+1][j].first==dp[i][j+1].first)
  38. {
  39. dp[i+1][j+1].first=dp[i][j+1].first;
  40. dp[i+1][j+1].second=min(dp[i][j+1].second,dp[i+1][j].second);
  41. }
  42. else
  43. {
  44. dp[i+1][j+1].first=dp[i][j+1].first;
  45. dp[i+1][j+1].second=dp[i][j+1].second;
  46. }
  47. }
  48. int lens=dp[len][len].first;
  49. string s=dp[len][len].second;
  50. if(lens&1)
  51. {
  52. int t=lens/2;
  53. for(int i=0;i<=t;i++)
  54. cout<<s[i];
  55. for(int i=t-1;i>=0;i--)
  56. cout<<s[i];
  57. cout<<endl;
  58. }
  59. else
  60. {
  61. int t=lens/2;
  62. for(int i=0;i<t;i++)
  63. cout<<s[i];
  64. for(int i=t-1;i>=0;i--)
  65. cout<<s[i];
  66. cout<<endl;
  67. }
  68. }
  69. return 0;
  70. }

第二种方法和POJ1159一样,不过是多了个路径而已

代码:

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <string>
  6. using namespace std;
  7. #define MAXN 1005
  8. string s;
  9. int dp[MAXN][MAXN];
  10. string path[MAXN][MAXN];
  11. int main()
  12. {
  13. int n;
  14. while(cin>>s)
  15. {
  16. memset(dp,0,sizeof(dp));
  17. int n=s.length();
  18. for(int i=n-1; i>=0; i--)
  19. for(int j=i; j<n; j++)
  20. if(s[i]==s[j])
  21. {
  22. dp[i][j]=dp[i+1][j-1];
  23. if(i!=j)path[i][j]=s[i]+path[i+1][j-1]+s[j];
  24. else
  25. path[i][j]=s[i];
  26. }
  27. else
  28. {
  29. if(dp[i+1][j]<dp[i][j-1])
  30. {
  31. dp[i][j]=dp[i+1][j]+1;
  32. path[i][j]=path[i+1][j];
  33. }
  34. else
  35. if(dp[i+1][j]==dp[i][j-1])
  36. {
  37. dp[i][j]=dp[i+1][j]+1;
  38. path[i][j]=min(path[i+1][j],path[i][j-1]);
  39. }
  40. else
  41. {
  42. dp[i][j]=dp[i][j-1]+1;
  43. path[i][j]=path[i][j-1];
  44. }
  45. }
  46. cout<<path[0][n-1]<<endl;
  47. }
  48. return 0;
  49. }

UVa11404 - Palindromic Subsequence(区间DP+打印路径)的更多相关文章

  1. POJ 1141 Brackets Sequence(区间DP, DP打印路径)

    Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...

  2. HDU4632:Palindrome subsequence(区间DP)

    Problem Description In mathematics, a subsequence is a sequence that can be derived from another seq ...

  3. 【noi 2.6_2000】&【poj 2127】 最长公共子上升序列 (DP+打印路径)

    由于noi OJ上没有Special Judge,所以我是没有在这上面AC的.但是在POJ上A了. 题意如标题. 解法:f[i][j]表示a串前i个和b串前j个且包含b[j]的最长公共上升子序列长度 ...

  4. HDU 4632 Palindrome subsequence(区间dp,回文串,字符处理)

    题目 参考自博客:http://blog.csdn.net/u011498819/article/details/38356675 题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. ...

  5. HDU 4632 Palindrome subsequence (区间DP)

    题意 给定一个字符串,问有多少个回文子串(两个子串可以一样). 思路 注意到任意一个回文子序列收尾两个字符一定是相同的,于是可以区间dp,用dp[i][j]表示原字符串中[i,j]位置中出现的回文子序 ...

  6. [HDU4362] Palindrome subsequence (区间DP)

    题目链接 题目大意 给你几个字符串 (1<len(s)<1000) ,要你求每个字符串的回文序列个数.对于10008取模. Solution 区间DP. 比较典型的例题. 状态定义: 令 ...

  7. hdu4632 Palindrome subsequence (区间dp)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4632 题意:求回文串子串的的个数. 思路:看转移方程就能理解了. dp[i][j] 表示区 ...

  8. POJ 题目1141 Brackets Sequence(区间DP记录路径)

    Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27793   Accepted: 788 ...

  9. poj 1458 Common Subsequence(区间dp)

    题目链接:http://poj.org/problem?id=1458 思路分析:经典的最长公共子序列问题(longest-common-subsequence proble),使用动态规划解题. 1 ...

随机推荐

  1. 2016032901 - ubuntu安装jdk

    在ubuntu上安装jdk,然后网上大部分相同的教程配置,结果运行java,javac,java -version总是出现莫名奇妙的问题. 原先配置完之后,运行java -version后出现下面内容 ...

  2. 一步步学习ASP.NET MVC3 (4)——Razor(2)

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章,我们介绍了Razor的一些基本语法,从Razor中我们可以出ASP.NET MVC的视图引擎给我们带来的便利,但是同 ...

  3. mongodb 简单部署方案及实例

    mongodb 简单部署方案及实例 转载:http://my.oschina.net/zhuzhu0129/blog/53290 第一节 准备工作 一 安装mongodb  我这里选用rehl 5.6 ...

  4. 解决在构造函数中使用Session,Session为null的问题

    问题描述: public abstract class PageBase : System.Web.UI.Page 在PageBase中如何使用Session??? 我直接用 Session[&quo ...

  5. 导出Excel文件

    /// <summary> /// 类说明:Assistant /// 更新网站:[url=http://www.sufeinet.com/thread-655-1-1.html]http ...

  6. SGU481 Hero of Our Time

    Description Saratov ACM ICPC teams have a tradition to come together on Halloween and recollect terr ...

  7. jQuery中的一些正则匹配表达式

    jQuery常用正则匹配表达式 落雨 //整数 "^-?[1-9]\\d*$", //正整数 "^[1-9]\\d*$", //负整数 intege2: &qu ...

  8. CSS使块半透明方法,兼容IE6

    前言 今天LOL玩机器人玩得真心不爽,实在崩溃,还是逛博客园比较爽些,记录自己的成长!说句实话我在编程方面确实是个菜鸟,菜到一种超神的地步,没一样自己特擅长的,悲催...... 废话少说,进入正题,H ...

  9. SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-006-定义切面使用xml

    一. you can also define pointcuts that can be used across multiple aspects by placing the <aop:poi ...

  10. Universal Asynchronous Receiver/Transmitter

    USART簡介與特性 NRZ標準資料格式(Mark/Space) 半雙工/全雙工 Synchronous 同步傳輸 CLOCK SKEW Asynchronous 非同步傳輸 半/全雙工.同步/非同步 ...