UVA 11404Palindromic Subsequence
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA 11404Palindromic Subsequence相关的知识,希望对你有一定的参考价值。
题解:
神一般的trick
首先求最长回文字符串的长度.只用反过来。转换为LCS问题就行
但是关键的要输出字典序最小的
所以在LCS的过程中。保存相应的字符串,并且保证字符串最小。这么求得的长度是对的。但是不一定是回文字符串
例如
bcbabccb
bccbabcb ---> bcabc。
想了很久。可能是因为字典序的问题。当前面一半固定的时候,后面一半应该是前面一半的翻转过来,但是有可能出现和前面一半一样的情景。。。。。(有毒)
具体修改。就是取前面一半即可
代码:
#include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define se second #define fs first #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> const int INF = 1000000000; const int maxn = 1050; const int M = 4000; string s1, s2; int n; int dp[ maxn ][ maxn ]; string s[ maxn ][ maxn ]; int main() { while( cin >> s1 ) { n = s1.length(); s2 = s1; reverse( s2.begin(), s2.end() ); memset( dp, 0, sizeof( dp ) ); for( int i = 1; i <= n; i ++ ) for( int j = 1; j <= n; j ++ ) { s[ i ][ j ].clear(); if( s1[ i - 1 ] == s2[ j - 1 ] ) { dp[ i ][ j ] = dp[ i - 1 ][ j - 1 ] + 1; s[ i ][ j ] = s[ i - 1 ][ j - 1 ] + s1[ i - 1 ]; } if( dp[ i ][ j ] <= dp[ i - 1 ][ j ] ) { if( dp[ i ][ j ] < dp[ i - 1 ][ j ] || ( dp[ i ][ j ] == dp[ i - 1 ][ j ] && s[ i ][ j ] > s[ i - 1 ][ j ] ) ) s[ i ][ j ] = s[ i - 1 ][ j ]; dp[ i ][ j ] = dp[ i - 1 ][ j ]; } if( dp[ i ][ j ] <= dp[ i ][ j - 1 ] ) { if( dp[ i ][ j ] < dp[ i ][ j - 1 ] || ( dp[ i ][ j ] == dp[ i ][ j - 1 ] && s[ i ][ j ] > s[ i ][ j - 1 ] ) ) s[ i ][ j ] = s[ i ][ j - 1 ]; dp[ i ][ j ] = dp[ i ][ j - 1 ]; } } string str1, str3; str1 = s[ n ][ n ].substr( 0, dp[ n ][ n ] / 2 ); str3 = str1; reverse( str3.begin(), str3.end() ); if( dp[ n ][ n ] & 1 ) cout << str1 << s[ n ][ n ][ dp[ n ][ n ] / 2 ] << str3 << endl; else cout << str1 << str3 << endl; } return 0; }
以上是关于UVA 11404Palindromic Subsequence的主要内容,如果未能解决你的问题,请参考以下文章