POJ 1159 Palindrome(LCS)
题目链接:http://poj.org/problem?id=1159
题目大意:给定一串字符,添加最少的字符,使之成为回文串。
Sample Input
5
Ab3bd
Sample Output
2 分析:这道题目之前有做过,就是将原字符串逆序得到另一个字符串,求它们的最长公共子序列,这样就能求得它的可以构成回文的最长字符数,用n减去即为添加最少可使之成为回文的数目。 可恨的是之前一直超内存,看了别人的解题报告,原来定义dp[MAX][MAX]时,不用int型,而是short型,内存只占int的一半(见上一篇日志) 另外逆序字符串可以不用新开一个数组,也可以直接在原数组上从后往前循环。 代码如下:
# include<stdio.h>
# include<string.h> #define MAX 5005 int max(int a,int b,int c){
int temp;
temp = a>b ? a :b;
return temp>c ?temp :c ;
}
char s[MAX],t[MAX];
short dp[MAX][MAX]; //定义的类型为short int main(){
int i,j,n;
while(scanf("%d",&n)!=EOF){
scanf("%s",s);
for(i=;i<n;i++)
t[i] = s[n-i-];
t[n] = ;
memset(dp,,sizeof(dp));
for(i=;i<=n;i++){
for(j=;j<=n;j++){
if(s[i-] == t[j-])
dp[i][j] = dp[i-][j-] + ;
dp[i][j] = max(dp[i][j],dp[i-][j],dp[i][j-]);
}
}
printf("%d\n",n-dp[n][n]);
}
return ;
}
另一种方法:dp[i][j]表示从第i个字符到第j个字符能构成的回文添加的最少字符。
#include <stdio.h>
#define Min(a,b) (a<b?a:b)
const int MAX = ;
char ch[MAX];
short dp[MAX][MAX]={};
int main()
{
int lenth, i, j;
while(scanf("%d%s",&lenth, ch+)!=EOF)
{
for(i=lenth;i>;i--) //自底向上
{
for(j=i+;j<=lenth;j++)
{
if(ch[i]==ch[j]){
dp[i][j] = dp[i+][j-];
}
else{
dp[i][j] = Min(dp[i+][j],dp[i][j-])+;
}
}
}
printf("%d\n",dp[][lenth]);
}
return ;
}
可是在某些变态的OJ里,上面的方法仍然不能AC,这是需要引入滚动数组优化空间,比如在第一种方法之上
代码如下:
# include<stdio.h>
# include<string.h> #define MAX 5005 int max(int a,int b,int c){
int temp;
temp = a>b ? a :b;
return temp>c ?temp :c ;
}
char s[MAX],t[MAX];
short dp[2][MAX]; int main(){
int i,j,n;
while(scanf("%d",&n)!=EOF){
scanf("%s",s);
for(i=;i<n;i++)
t[i] = s[n-i-];
t[n] = ;
memset(dp,,sizeof(dp));
for(i=;i<=n;i++){
for(j=;j<=n;j++){
if(s[i-] == t[j-])
dp[i%][j] = dp[(i-)%][j-] + ;
dp[i%][j] = max(dp[i%][j],dp[(i-)%][j],dp[i%][j-]);
}
}
printf("%d\n",n-dp[n%][n]);
}
return ;
}
POJ 1159 Palindrome(LCS)的更多相关文章
- poj - 1159 - Palindrome(滚动数组dp)
题意:一个长为N的字符串( 3 <= N <= 5000).问最少插入多少个字符使其变成回文串. 题目链接:http://poj.org/problem?id=1159 -->> ...
- POJ 1159 Palindrome(最长公共子序列)
http://poj.org/problem?id=1159 题意: 给出一个字符串,计算最少要插入多少个字符可以使得该串变为回文串. 思路: 计算出最长公共子序列,再用原长-LCS=所要添加的字符数 ...
- POJ - 1159 Palindrome(dp-回文变形)
d.求对字符串最少添加几个字符可变为回文串. s. 法1:直接对它和它的逆序串求最长公共子序列长度len.N-len即为所求.(N为串长度) 因为,要求最少添加几个字符,我们可以先从原串中找到一个最长 ...
- poj 1159 Palindrome 【LCS】
任意门:http://poj.org/problem?id=1159 解题思路: LCS + 滚动数组 AC code: #include <cstdio> #include <io ...
- poj 1080 基因组(LCS)
Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19376 Accepted: ...
- HDU 1513 && POJ 1159 Palindrome (DP+LCS+滚动数组)
题意:给定一个字符串,让你把它变成回文串,求添加最少的字符数. 析:动态规划是很明显的,就是没有了现思路,还是问的别人才知道,哦,原来要么写,既然是回文串, 那么最后正反都得是一样的,所以我们就正反求 ...
- POJ 1159 Palindrome(字符串变回文:LCS)
POJ 1159 Palindrome(字符串变回文:LCS) id=1159">http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要 ...
- POJ 题目分类(转载)
Log 2016-3-21 网上找的POJ分类,来源已经不清楚了.百度能百度到一大把.贴一份在博客上,鞭策自己刷题,不能偷懒!! 初期: 一.基本算法: (1)枚举. (poj1753,poj2965 ...
- POJ题目分类(转)
初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. ...
随机推荐
- OpenCV学习(一)
环境:OpenCV 2.4.4 VS2010 第一个Demo,显示一张图片 #include "opencv2/highgui/highgui.hpp" int main( int ...
- dell vfoglight
vFoglight针对RH/Vmware/Hyper-v/Vsphere环境的相关软件包下载链接 https://software.dell.com/register/getfile/?param=2 ...
- Java 8 简明教程
欢迎阅读我编写的 Java 8 介绍.本教程将带领你一步步认识这门语言的所有新特性.通过简单明了的代码示例,你将会学习到如何使用默认接口方法,Lambda表达式,方法引用和可重复注解.在这篇教程的最后 ...
- 【oracle】触发器简单实现
目标:实现实时备份uertest表数据至usertest_temp中,两表结构一致 解决:用oracle触发器实现同步 结果: 1.建表 -- 简单的用户表 create table USERTEST ...
- 04、生成 HTMLTestRunner 测试报告
1.HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展.它生成易于使用的 HTML 测试报告 1>下载HTMLTestRunner.py文件,地址为: h ...
- JavaScript apply函数小案例
//回调函数1 function callback(a,b,c) { alert(a+b+c); } //回调函数2 function callback2(a,b) { alert(a+b); } / ...
- angular js 表单验证
<!doctype html> <html ng-app="myapp"> <head> <meta charset="UTF- ...
- 分享一个漂亮的ProgressBar控件
codeprject上看到的一个漂亮的ProgressBar控件.是用vb.net开发的. C#直接在工具箱中引用即可. 地址:http://www.codeproject.com/Articles/ ...
- 关于RGB转换YUV的探讨与实现
最近在Android手机上使用相机识别条形码工作取得了比较理想的进展,自动识别功能基本完成,然而在手动识别指定条形码图片时遇到困难,由于Zxing开源Jar包识别图片的颜色编码式为YUV,而普通的图片 ...
- iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】
iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成(pre)还是后生成(post). Oracle设置 <!-- Oracle SE ...