poj1159 Palindrome(最长公共子序列)

Palindrome

Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 52966   Accepted: 18271

Description

A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a program which, given a string, determines the minimal number of characters to be inserted into the string in order
to obtain a palindrome.

As an example, by inserting 2 characters, the string "Ab3bd" can be transformed into a palindrome ("dAb3bAd" or "Adb3bdA"). However, inserting fewer than 2 characters does not produce a palindrome.

Input

Your program is to read from standard input. The first line contains one integer: the length of the input string N, 3 <= N <= 5000. The second line contains one string with length N. The string is formed from uppercase letters from ‘A‘ to ‘Z‘, lowercase letters
from ‘a‘ to ‘z‘ and digits from ‘0‘ to ‘9‘. Uppercase and lowercase letters are to be considered distinct.

Output

Your program is to write to standard output. The first line contains one integer, which is the desired minimal number.

Sample Input

5
Ab3bd

Sample Output

2
13368265 happystick 1159 Accepted 148K 719MS C++ 720B 2014-08-23 21:42:27
//最少插入字符个数 =字符串长度-正、逆序的最长公共子序列长度
/*
一维数组+short   优化wa了好几次,无语了 刚开始是以为多组测试数据,一直wa看了半天人家的代码才知道。。。。就一组测试数据不过这个代码应该是最优代码吧 参考的南阳优秀代码   同样代码在hdoj提交wa   无语
Time:2014-8-23 21:47
*/
#include<stdio.h>
#include<string.h>
int main(){
	char s1[5005],s2[5005];
	short dp[5005];
	int N;
		scanf("%d",&N);
		scanf("%s",s1);
		for(int i=0;i<N;i++){
			s2[i]=s1[N-i-1];
		};s2[N]='\0';
	//	printf("%s %s\n",s1,s2);
		int old,temp;
		memset(dp,0,sizeof(dp));
		//old 代表dp[i-1][j-1]
		//dp[j]代表 dp[i-1][j]
		for(int i=0;i<N;i++){
			old=0;//将old初始置为 0
			for(int j=0;j<N;j++){
				temp=dp[j];//将dp[i-1][j]记下来,为下一列的old
				if(s1[i]==s2[j]){
					dp[j]=old+1;
				}else{
					dp[j]=temp>dp[j-1]?temp:dp[j-1];//取dp[i-1][j]和dp[i][j-1]中的较大值
				}
				old=temp;//上一列的dp[i-1][j]为下一列的dp[i-1][j-1]
			}
		}
		printf("%d\n",N-dp[N-1]); 

return 0;
}

时间: 2024-10-10 02:31:31

poj1159 Palindrome(最长公共子序列)的相关文章

POJ1159——Palindrome(最长公共子序列+滚动数组)

Palindrome DescriptionA palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a program which, given a string, determines the minimal number of characters to be inser

POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)

Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 56150   Accepted: 19398 Description A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a

uva 11151 Longest Palindrome (最长公共子序列)

uva 11151 Longest Palindrome A palindrome is a string that reads the same from the left as it does from the right. For example, I, GAG and MADAM are palindromes, but ADAM is not. Here, we consider also the empty string as a palindrome. From any non-p

HDU 1513 Palindrome(最长公共子序列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 解题报告:给定一个长度为n的字符串,在这个字符串中插入最少的字符使得这个字符串成为回文串,求这个最少的个数是多少? 一开始以为只是一个普通的DP题,但是按照我的想法敲出来之后怎么样都W了,无奈搜了解题报告,得知其实这个就是一个最长公共子序列问题,就是求这个字符串跟它的逆序的 字符串的最长公共子序列.因为杭电的题内存都要求在32M内存以内,所以很开心的敲出来才发现10^6的数组都开不了,所以只好

poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)

Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 53414   Accepted: 18449 Description A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a

Problem 2902 - palindrome(最长公共字串)

Longest PalindromeTime Limit:3000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu SubmitStatus Description Problem D: Longest Palindrome Time limit: 10 seconds A palindrome is a string that reads the same from the left as it does from the right.

最长公共子序列的代码实现

关于最长公共子序列(LCS)的相关知识,http://blog.csdn.net/liufeng_king/article/details/8500084 这篇文章讲的比较好,在此暂时不再详说. 以下是我代码实现两种方式:递归+递推: 1 #include <bits/stdc++.h> 2 using namespace std; 3 int A[100]; 4 int B[100]; 5 6 //int B[]={2,3,5,6,9,8,4}; 7 int d[100][100]={0};

NYOJ 36 &amp;&amp;HDU 1159 最长公共子序列(经典)

链接:click here 题意:tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0<N<100)表示待测数据组数 接下来每组数据两行,分别为待测的两组字符串.每个字符串长度不大于1000. 输出 每组测试数据输出一个整数,表示最长公共子序列长度.每组

最长公共子序列(LCS)问题

最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列:也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续. 1.序列str1和序列str2 ·长度分别为m和n: ·创建1个二维数组L[m.n]: ·初始化L数组内容为0 ·m和n分别从0开始,m++,n++循环: - 如果str1[m] ==