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的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp UVa 11404 - 回文序列

UVA - 11404

UVa 11404 回文子序列(LCS求最长回文串长度)

UVA11404 Now or later

UVA11027 Palindromic Permutation回文

subs函数