HDU 1513 Palindrome:LCS(最长公共子序列)or 记忆化搜索
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513
题意:
给你一个字符串s,你可以在s中的任意位置添加任意字符,问你将s变成一个回文串最少需要添加字符的个数。
题解1(LCS):
很神奇的做法。
先求s和s的反串的LCS,也就是原串中已经满足回文性质的字符个数。
然后要变成回文串的话,只需要为剩下的每个落单的字符,相应地插入一个和它相同的字符即可。
所以答案是:s.size()-LCS(s,rev(s))
另外,求LCS时只会用到lcs[i-1][j-1],lcs[i-1][j],lcs[i][j-1],因为空间不够,改为滚动数组,将第一维[MAX_N]变为[2]。
题解2(记忆化搜索):
做法是对的,但是空间占用太大,会MLE。
dfs(x,y)表示让s串中[x,y]这个区间变为回文串的花费。
两种情况:
(1)s[x]==s[y]:
s[x]和s[y]已经配对,所以return dfs(x+1,y-1);
(2)s[x]!=s[y]:
有两种解决办法:
1.让[x+1,y]变为回文串,然后在y的右边添加一个字符等于s[x]。
2.让[x,y-1]变为回文串,然后在x的左边添加一个字符等于s[y]。
所以return min(dfs(x+1,y),dfs(x,y-1))+1;
判断dfs结束边界:
(1)dp[x][y]!=-1:之前已经算过了,那就不用再算一遍了,return dp[x][y]。
(2)x==y: return 0;
(3)x+1==y: 如果s[x]==s[y],return 0;如果s[x]!=s[y],return 1;
另外,每次dfs算出新的dp时,及时保存到dp数组中。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAX_N 5005 using namespace std; int n;
int dp[][MAX_N];
string s; int lcs(string a,string b)
{
memset(dp,,sizeof(dp));
for(int i=;i<=a.size();i++)
{
for(int j=;j<=b.size();j++)
{
if(a[i-]==b[j-]) dp[i&][j]=dp[(i-)&][j-]+;
else dp[i&][j]=max(dp[(i-)&][j],dp[i&][j-]);
}
}
return dp[a.size()&][b.size()];
} int palindrome(string s)
{
string rev=s;
reverse(rev.begin(),rev.end());
return s.size()-lcs(s,rev);
} int main()
{
while(cin>>n>>s)
{
cout<<palindrome(s)<<endl;
}
}
没AC Code:
// dp[x][y] = min num of chars appended to s
// dp[x][x] = 0
//
// 1) s[i] != s[j]:
// dp[x][x+1] = 1
// dp[x][y] = min(dp[x+1][y], dp[x][y-1]) + 1
//
// 2) s[i] == s[j]
// dp[x][y] = dp[x+1][y-1] #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 5005 using namespace std; int n;
int dp[MAX_N][MAX_N];
string s; int dfs(int x,int y)
{
if(dp[x][y]!=-) return dp[x][y];
if(x==y) return dp[x][y]=;
if(x+==y) return dp[x][y]=(s[x]==s[y]?:);
if(s[x]==s[y]) return dp[x][y]=dfs(x+,y-);
return dp[x][y]=min(dfs(x+,y),dfs(x,y-))+;
} int main()
{
while(cin>>n>>s)
{
memset(dp,-,sizeof(dp));
cout<<dfs(,s.size()-)<<endl;
}
}
HDU 1513 Palindrome:LCS(最长公共子序列)or 记忆化搜索的更多相关文章
- HDU 1513 Palindrome(最长公共子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 解题报告:给定一个长度为n的字符串,在这个字符串中插入最少的字符使得这个字符串成为回文串,求这个 ...
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...
- POJ 1458 Common Subsequence(LCS最长公共子序列)
POJ 1458 Common Subsequence(LCS最长公共子序列)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?c ...
- 动态规划模板2|LCS最长公共子序列
LCS最长公共子序列 模板代码: #include <iostream> #include <string.h> #include <string> using n ...
- LCS 最长公共子序列
区别最长公共子串(连续) ''' LCS 最长公共子序列 ''' def LCS_len(x, y): m = len(x) n = len(y) dp = [[0] * (n + 1) for i ...
- HDU 1159 Common Subsequence 最长公共子序列
HDU 1159 Common Subsequence 最长公共子序列 题意 给你两个字符串,求出这两个字符串的最长公共子序列,这里的子序列不一定是连续的,只要满足前后关系就可以. 解题思路 这个当然 ...
- hdu 1159 Common Subsequence(LCS最长公共子序列)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- LCS最长公共子序列~dp学习~4
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 Palindrome Time Limit: 4000/2000 MS (Java/Others ...
- LCS最长公共子序列(最优线性时间O(n))
这篇日志主要为了记录这几天的学习成果. 最长公共子序列根据要不要求子序列连续分两种情况. 只考虑两个串的情况,假设两个串长度均为n. 一,子序列不要求连续. (1)动态规划(O(n*n)) (转自:h ...
- LCS最长公共子序列
问题:最长公共子序列不要求所求得的字符串在所给字符串中是连续的,如输入两个字符串ABCBDAB和BDCABA,字符串BCBA和BDAB都是他们的公共最长子序列 该问题属于动态规划问题 解答:设序列X= ...
随机推荐
- Tomcat常用配置修改
Tomcat常用配置修改 说明 运行需要设置环境变量 JAVA_HOME 即JDK安装目录 tomcat 默认登录地址 http://localhost:8080 配置tomcat 1.端口设置 打开 ...
- Python系列教程(三):输入和输出
1.1 raw_input() 在Python中,获取键盘输入的数据的方法是采用 raw_input 函数(至于什么是函数,咱们以后的章节中讲解),那么这个 raw_input 怎么用呢? 看如下示例 ...
- KBEngine WebConsole Guide
https://github.com/kbengine/kbengine/tree/master/docs
- 浅入深出之Java集合框架(上)
Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...
- MQ队列管理
分享一段代码,很实用. 下面这段java代码是我在国外一个论坛上发现的,源地址已经忘了.代码的作用是可以删除正在使用的mq的队列消息,管理mq的人一定知道它的美妙了吧,哈哈. 我拿来改了下,增加了2个 ...
- 把编译安装的httpd 实现服务脚本,通过service和chkconfig 进行管理
把编译安装的httpd 实现服务脚本,通过service和chkconfig 进行管理 1 编译安装httpd 把httpd编译安装在/app/httpd/目录下. 2 在/etc/rc.d/init ...
- English Learning - Vampire bats
" Vampire bats are very adaptable." Bambi said. And when their roosts are disrupted or the ...
- python编程快速上手之第8章实践项目参考答案
第8章实践项目之疯狂填词 创建一个一个疯狂填词(Mad Libs),程序,它将读入文本文件,并让用户在该文本文件中出现 ADJECTIVE,NOUN,VERB等单词的地方,加上他们自己的文本. 首先准 ...
- Java 容器在实际项目中的应用
前言:在java开发中我们离不开集合数组等,在java中有个专有名词:"容器" ,下面会结合Thinking in Java的知识和实际开发中业务场景讲述一下容器在Web项目中的用 ...
- Linux下mysql远程连接问题
[旧博客转移 - 发布于2015年9月6日 18:42] 在Linux上装好Mysql后 发现远程客户端连接不上 出现这种情况是因为mysql服务器出于安全考虑,默认只允许本地登录数据库服务器. ...