您的位置:首页 > 其它

UVA 11151 Longest Palindrome (最大回文串)

2013-03-28 08:36 393 查看
这里面读题一定要精准,首先它说的是从一个string里面take away一些字符,使得剩下的字符成为一个palindrome,这里求的是palindrome的最大长度,那么也就是说删除最少的字符使得这个string成为一个palindrome,并且可是在原串不连续的。

那么这个道题和之前做的longest palindrome还有有区别的,之前一定是substring,表示一定是在原串中连续的,及连通的,这个不一定。

那么如果是palindrome的话,那么从前往后和从后往前都是一样的,朋友说求一下本串和逆串的最大公共子序列,没有错,就是这样的,在本串中存在,在逆串中也存在,那么就说明从前读和从后读是一样的,而LCS就是最大palindrome了!

代码如下:

//LCS
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

int c[1000][1000], T;
string s, ss;

int main()
{
scanf("%d", &T);
getchar();
while ( T-- ) {
getline( cin, s );
if ( s == "" ) {
printf("0\n");
continue;
}
ss.clear();
for ( int i = s.size() -1; i >= 0; ss += s[i], --i );
memset( c, 0, sizeof(c) );
int n = ss.size();
for ( int i = 1; i <= n; ++i )
for ( int j = 1; j <= n; ++j ) {
if ( s[i-1] == ss[j-1] ) c[i][j] = c[i-1][j-1] + 1;
else c[i][j] = max( c[i-1][j], c[i][j-1] );
}
printf("%d\n", c

);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: