Palindrome
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 Source |
中文题目名是回文词、、、老题了。网上找了中文的题目
描述 Description
比如字符串“Ab3bd”,在插入两个字符后可以变成一个回文词(“dAb3bAd”或“Adb3bdA”)。
输入格式 Input Format
第一行包含一个整数N,表示给定字符串的长度,3<=N<=5000。
第二行是一个长度为N的字符串,字符串由大小写字母和数字构成。
输出格式 Output Format
求出字符串正序和反序的最长公共子序列,然后长度减去最长公共子序列就是要插入的个数。
因为空间要求高,5000*5000的int数组会超时。所以需要滚动数组优化。
话说,高中学这个的时候完全没看懂的说。不过现在弄明白了。%2非常巧妙,避免了复制数组
看到别人在题解上炫耀时间空间神马的。像我这样图省事用cin和string类。时间空间消耗都很大。
#include <iostream>
using namespace std;
int a[2][5001]={0},n,i,j;
string s;
int main()
{
cin>>n>>s;
for (i=1;i<=n;++i)
for (j=1;j<=n;++j)
if (s[i-1]==s[n-j])
a[i%2][j]=a[(i-1)%2][j-1]+1;
else a[i%2][j]=a[(i-1)%2][j]>a[i%2][j-1]?a[(i-1)%2][j]:a[i%2][j-1];
cout<<n-a[n%2][n]<<endl;
return 0;
}
kdwycz的网站: http://kdwycz.com/
kdwyz的刷题空间:http://blog.csdn.net/kdwycz