题目链接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)的更多相关文章

  1. poj - 1159 - Palindrome(滚动数组dp)

    题意:一个长为N的字符串( 3 <= N <= 5000).问最少插入多少个字符使其变成回文串. 题目链接:http://poj.org/problem?id=1159 -->> ...

  2. POJ 1159 Palindrome(最长公共子序列)

    http://poj.org/problem?id=1159 题意: 给出一个字符串,计算最少要插入多少个字符可以使得该串变为回文串. 思路: 计算出最长公共子序列,再用原长-LCS=所要添加的字符数 ...

  3. POJ - 1159 Palindrome(dp-回文变形)

    d.求对字符串最少添加几个字符可变为回文串. s. 法1:直接对它和它的逆序串求最长公共子序列长度len.N-len即为所求.(N为串长度) 因为,要求最少添加几个字符,我们可以先从原串中找到一个最长 ...

  4. poj 1159 Palindrome 【LCS】

    任意门:http://poj.org/problem?id=1159 解题思路: LCS + 滚动数组 AC code: #include <cstdio> #include <io ...

  5. poj 1080 基因组(LCS)

    Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19376   Accepted:  ...

  6. HDU 1513 && POJ 1159 Palindrome (DP+LCS+滚动数组)

    题意:给定一个字符串,让你把它变成回文串,求添加最少的字符数. 析:动态规划是很明显的,就是没有了现思路,还是问的别人才知道,哦,原来要么写,既然是回文串, 那么最后正反都得是一样的,所以我们就正反求 ...

  7. POJ 1159 Palindrome(字符串变回文:LCS)

    POJ 1159 Palindrome(字符串变回文:LCS) id=1159">http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要 ...

  8. POJ 题目分类(转载)

    Log 2016-3-21 网上找的POJ分类,来源已经不清楚了.百度能百度到一大把.贴一份在博客上,鞭策自己刷题,不能偷懒!! 初期: 一.基本算法: (1)枚举. (poj1753,poj2965 ...

  9. POJ题目分类(转)

    初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推. ...

随机推荐

  1. Windows Phone SDK 8.0 安装系统要求

    Windows Phone SDK 8.0 是一个功能齐全的开发环境,可用于构建 Windows Phone 8.0 和 Windows Phone 7.5 的应用和游戏. Windows Phone ...

  2. jQuery获取属性之自己遇到的问题

    刚开始是这种写法  用的 attr  结果获取不到 if($("#reg_username_span").attr("display") == 'block') ...

  3. apache的FileUtils方法大全

    FileUtils 获取系统的临时目录路径:getTempDirectoryPath() [java] view plaincopyprint? public static String getTem ...

  4. poj 2079 Triangle(旋转卡壳)

    Triangle Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 8917   Accepted: 2650 Descript ...

  5. 虚拟机之仅主机模式(HostOnly)链接外网设置

    我的环境: 虚拟机-VMware 虚拟系统-CentOS 现实主机-win7 具体设置步骤: 一.设置现实主机 (地址等不用额外设置,下面是我电脑正常上网的配置) 将本地链接设置共享(这步很重要) 二 ...

  6. 神经网络中误差反向传播(back propagation)算法的工作原理

    注意:版权所有,转载需注明出处. 神经网络,从大学时候就知道,后面上课的时候老师也讲过,但是感觉从来没有真正掌握,总是似是而非,比较模糊,好像懂,其实并不懂. 在开始推导之前,需要先做一些准备工作,推 ...

  7. The File's Owner

    The File Owner is an instantiated, runtime object that owns the contents of your nib and its outlets ...

  8. Intent是什么?

    一.理解Intent: 在一个Android应用中,主要是由四种组件组成的,这四种组件可参考“Android应用的构成”.而这四种组件是独立的,它们之间可以互相调用,协调工作,最终组成一个真正的And ...

  9. BOM、DOM学习笔记——JavaScript

    1.BOM的概述    browser object modal :浏览器对象模型.    浏览器对象:window对象.    Window 对象会在 <body> 或 <fram ...

  10. NavBarControl 左侧菜单

    (1)示例图片 具体实现: 一. using DevExpress.XtraNavBar; 二. 从窗体上拖一个 NavBarControl 控件 命名为:nbcLeft 三.窗体OnLoad 事件 ...