POJ 1159 Palindrome 题解

本题的题意理解之后,就是求最长回文子序列 longest palindrome subsequence,这里注意子序列和子串的区别。

有两种求法,一种是直接求,相当于填矩阵右上对角阵,另一种是转化为longest common subsequence的求法。

最大难点就是要求内存不能使用二维的。 故此第一种方法是有点难度的,因为需要把二维矩阵的对角线转化为一维表记录,对好下标就好了。

第二中方法会稍微容易点,效率都是一样的O(n*n)。

方法1:

#include <cstdio>

const int MAX_N = 5001;//超过这个输入,如果是MAX_N*MAX_N的内存都会超内存
int len;
char chs[MAX_N];
inline int max(int a, int b) { return a > b? a : b; }
int tbl[2][MAX_N];

int longestPalindromeSequence()
{
	for (int i = 0; i < len; i++) tbl[0][i] = 1;
	bool id = false;

	for (int d = 2; d <= len; d++)
	{
		id = !id;
		for (int i = 0, j = i+d-1; j < len; i++, j++)
		{
			if (chs[i] == chs[j] && d == 2) tbl[id][i] = 2;
			else if (chs[i] == chs[j]) tbl[id][i] = tbl[id][i+1] + 2;
			else tbl[id][i] = max(tbl[!id][i], tbl[!id][i+1]);
		}
	}
	return tbl[id][0];
}

int main()
{
	while (~scanf("%d", &len))
	{
		getchar();	//Don't forget the last line's '\n' character.
		gets(chs);
		printf("%d\n", len - longestPalindromeSequence());
	}
	return 0;
}

方法二,转化为longest common subsequence

#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
const int MAX_N = 5001;//超过这个输入,如果是MAX_N*MAX_N的内存都会超内存
int len;
char chs[MAX_N];
char revChs[MAX_N];
inline int max(int a, int b) { return a > b? a : b; }
int tbl[2][MAX_N];

int longestCommonSequence()
{
	memset(tbl[0], 0, sizeof(int)*(len+1));
	tbl[1][0] = 0;
	bool id = false;
	for (int i = 0; i < len; i++)
	{
		id = !id;
		for (int j = 0; j < len; j++)
		{
			if (chs[i] == revChs[j]) tbl[id][j+1] = tbl[!id][j] + 1;
			else tbl[id][j+1] = max(tbl[!id][j+1], tbl[id][j]);
		}
	}
	return tbl[id][len];
}

int main()
{
	while (~scanf("%d", &len))
	{
		getchar();	//Don't forget the last line's '\n' character.
		gets(chs);
		strncpy(revChs, chs, len);
		reverse(revChs, revChs+len);
		printf("%d\n", len - longestCommonSequence());
	}
	return 0;
}

POJ 1159 Palindrome 题解,布布扣,bubuko.com

时间: 2024-08-02 15:13:00

POJ 1159 Palindrome 题解的相关文章

POJ 1159 Palindrome

Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 51518   Accepted: 17733 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

POJ 1159 Palindrome &amp;&amp; HDU 1159 Common Subsequence

1.先说说杭电的1159吧! 这道题是基础动规,比较简单! 就是要你求最长的公共子序列(不要优化) 动态转移方程: dp[i+1][j+1]=(a[i]=b[i])?dp[i][j]+1:max(dp[i+1][j],dp[i][j+1]) AC代码: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 520 char a[N],b[N]; in

LCS POJ 1159 Palindrome

题目传送门 1 /* 2 LCS裸题:长度减去最大相同长度就是要插入的个数 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <cstring> 7 #include <algorithm> 8 #include <string> 9 using namespace std; 10 11 const int MAXN = 5e3 + 10; 12 const int INF = 0

LCS(滚动数组) POJ 1159 Palindrome

题目传送门 1 /* 2 LCS裸题:长度减去最大相同长度就是要插入的个数 3 dp数组二维都开5000的话就会超内存,这里就用到了滚动数组, 4 因为在LCS的计算中,i的变化只相差1,所以可以通过对2取余来进行滚动:) 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <cstring> 9 #include <algorithm> 10 #include <string> 1

poj 1159 Palindrome lcs+滚动数组

点击打开链接题目链接 Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 52910   Accepted: 18248 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

poj 1159 Palindrome (LCS)

链接:poj 1159 题意:给定一个字符串,求最少添加多少个字符可使得该字符串变为回文字符串 分析:设原序列S的逆序列为S' ,最少需要补充的字母数 = 原序列S的长度 - S和S'的最长公共子串长度 原因:要求最少添加几个字符,我们可以先从原串中找到一个最长回文串,然后对于原串中不属于这个回文串的字符,在它关于回文串中心的对称位置添加一个相同字符即可.那么需要添加的字符数量即为n-最长回文串长度. 最长回文串可以看作是原串中前面和后面字符的一种匹配(每个后面的字符在前面找到一个符合位置要求的

POJ 1159 Palindrome DP

Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 51913   Accepted: 17877 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

POJ 1159 Palindrome(lcs加滚动数组)

Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 52350   Accepted: 18041 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

poj 1159 Palindrome - 动态规划

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