UVa11404 - Palindromic Subsequence(区间DP+打印路径)
题目大意
给定一个字符串,要求你删除尽量少的字符,使得原字符串变为最长回文串,并把回文串输出,如果答案有多种,则输出字典序最小的
题解
有两种解法,第一种是把字符串逆序,然后求两个字符串的LCS,并记录LCS,长度就等于最长回文串的长度,不过求出来的LCS不一定是回文串,例如下面这个例子
- s = 1 5 2 4 3 3 2 4 5 1
- reverse(s) = 1 5 4 2 3 3 4 2 5 1
- LCS = 1 5 2 3 3 4 5 1
- 所以我们只需要LCS的前半段即可
代码:
- #include <cstdio>
- #include <algorithm>
- #include <string>
- #include <iostream>
- #include <utility>
- using namespace std;
- #define MAXN 1005
- string a,b;
- pair<int,string>dp[MAXN][MAXN];
- int main()
- {
- while(cin>>a)
- {
- int len=a.length();
- b=a;
- reverse(b.begin(),b.end());
- for(int i=0;i<len;i++)
- {
- dp[0][i].first=0,dp[0][i].second="";
- dp[i][0].first=0,dp[i][0].second="";
- }
- for(int i=0;i<len;i++)
- for (int j=0;j<len;j++)
- if(a[i]==b[j])
- {
- dp[i+1][j+1].first=dp[i][j].first+1;
- dp[i+1][j+1].second=dp[i][j].second+a[i];
- }
- else
- {
- if(dp[i+1][j].first>dp[i][j+1].first)
- {
- dp[i+1][j+1].first=dp[i+1][j].first;
- dp[i+1][j+1].second=dp[i+1][j].second;
- }
- else
- if(dp[i+1][j].first==dp[i][j+1].first)
- {
- dp[i+1][j+1].first=dp[i][j+1].first;
- dp[i+1][j+1].second=min(dp[i][j+1].second,dp[i+1][j].second);
- }
- else
- {
- dp[i+1][j+1].first=dp[i][j+1].first;
- dp[i+1][j+1].second=dp[i][j+1].second;
- }
- }
- int lens=dp[len][len].first;
- string s=dp[len][len].second;
- if(lens&1)
- {
- int t=lens/2;
- for(int i=0;i<=t;i++)
- cout<<s[i];
- for(int i=t-1;i>=0;i--)
- cout<<s[i];
- cout<<endl;
- }
- else
- {
- int t=lens/2;
- for(int i=0;i<t;i++)
- cout<<s[i];
- for(int i=t-1;i>=0;i--)
- cout<<s[i];
- cout<<endl;
- }
- }
- return 0;
- }
第二种方法和POJ1159一样,不过是多了个路径而已
代码:
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- #include <iostream>
- #include <string>
- using namespace std;
- #define MAXN 1005
- string s;
- int dp[MAXN][MAXN];
- string path[MAXN][MAXN];
- int main()
- {
- int n;
- while(cin>>s)
- {
- memset(dp,0,sizeof(dp));
- int n=s.length();
- for(int i=n-1; i>=0; i--)
- for(int j=i; j<n; j++)
- if(s[i]==s[j])
- {
- dp[i][j]=dp[i+1][j-1];
- if(i!=j)path[i][j]=s[i]+path[i+1][j-1]+s[j];
- else
- path[i][j]=s[i];
- }
- else
- {
- if(dp[i+1][j]<dp[i][j-1])
- {
- dp[i][j]=dp[i+1][j]+1;
- path[i][j]=path[i+1][j];
- }
- else
- if(dp[i+1][j]==dp[i][j-1])
- {
- dp[i][j]=dp[i+1][j]+1;
- path[i][j]=min(path[i+1][j],path[i][j-1]);
- }
- else
- {
- dp[i][j]=dp[i][j-1]+1;
- path[i][j]=path[i][j-1];
- }
- }
- cout<<path[0][n-1]<<endl;
- }
- return 0;
- }
UVa11404 - Palindromic Subsequence(区间DP+打印路径)的更多相关文章
- POJ 1141 Brackets Sequence(区间DP, DP打印路径)
Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...
- HDU4632:Palindrome subsequence(区间DP)
Problem Description In mathematics, a subsequence is a sequence that can be derived from another seq ...
- 【noi 2.6_2000】&【poj 2127】 最长公共子上升序列 (DP+打印路径)
由于noi OJ上没有Special Judge,所以我是没有在这上面AC的.但是在POJ上A了. 题意如标题. 解法:f[i][j]表示a串前i个和b串前j个且包含b[j]的最长公共上升子序列长度 ...
- HDU 4632 Palindrome subsequence(区间dp,回文串,字符处理)
题目 参考自博客:http://blog.csdn.net/u011498819/article/details/38356675 题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. ...
- HDU 4632 Palindrome subsequence (区间DP)
题意 给定一个字符串,问有多少个回文子串(两个子串可以一样). 思路 注意到任意一个回文子序列收尾两个字符一定是相同的,于是可以区间dp,用dp[i][j]表示原字符串中[i,j]位置中出现的回文子序 ...
- [HDU4362] Palindrome subsequence (区间DP)
题目链接 题目大意 给你几个字符串 (1<len(s)<1000) ,要你求每个字符串的回文序列个数.对于10008取模. Solution 区间DP. 比较典型的例题. 状态定义: 令 ...
- hdu4632 Palindrome subsequence (区间dp)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4632 题意:求回文串子串的的个数. 思路:看转移方程就能理解了. dp[i][j] 表示区 ...
- POJ 题目1141 Brackets Sequence(区间DP记录路径)
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27793 Accepted: 788 ...
- poj 1458 Common Subsequence(区间dp)
题目链接:http://poj.org/problem?id=1458 思路分析:经典的最长公共子序列问题(longest-common-subsequence proble),使用动态规划解题. 1 ...
随机推荐
- 2016032901 - ubuntu安装jdk
在ubuntu上安装jdk,然后网上大部分相同的教程配置,结果运行java,javac,java -version总是出现莫名奇妙的问题. 原先配置完之后,运行java -version后出现下面内容 ...
- 一步步学习ASP.NET MVC3 (4)——Razor(2)
请注明转载地址:http://www.cnblogs.com/arhat 在上一章,我们介绍了Razor的一些基本语法,从Razor中我们可以出ASP.NET MVC的视图引擎给我们带来的便利,但是同 ...
- mongodb 简单部署方案及实例
mongodb 简单部署方案及实例 转载:http://my.oschina.net/zhuzhu0129/blog/53290 第一节 准备工作 一 安装mongodb 我这里选用rehl 5.6 ...
- 解决在构造函数中使用Session,Session为null的问题
问题描述: public abstract class PageBase : System.Web.UI.Page 在PageBase中如何使用Session??? 我直接用 Session[&quo ...
- 导出Excel文件
/// <summary> /// 类说明:Assistant /// 更新网站:[url=http://www.sufeinet.com/thread-655-1-1.html]http ...
- SGU481 Hero of Our Time
Description Saratov ACM ICPC teams have a tradition to come together on Halloween and recollect terr ...
- jQuery中的一些正则匹配表达式
jQuery常用正则匹配表达式 落雨 //整数 "^-?[1-9]\\d*$", //正整数 "^[1-9]\\d*$", //负整数 intege2: &qu ...
- CSS使块半透明方法,兼容IE6
前言 今天LOL玩机器人玩得真心不爽,实在崩溃,还是逛博客园比较爽些,记录自己的成长!说句实话我在编程方面确实是个菜鸟,菜到一种超神的地步,没一样自己特擅长的,悲催...... 废话少说,进入正题,H ...
- 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 ...
- Universal Asynchronous Receiver/Transmitter
USART簡介與特性 NRZ標準資料格式(Mark/Space) 半雙工/全雙工 Synchronous 同步傳輸 CLOCK SKEW Asynchronous 非同步傳輸 半/全雙工.同步/非同步 ...