码迷,mamicode.com
首页 > 其他好文 > 详细

UVA 11404 Palindromic Subsequence

时间:2016-12-04 07:57:25      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:namespace   string   log   文字   define   sizeof   else   mic   seq   

题解:

神一般的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 11404 Palindromic Subsequence

标签:namespace   string   log   文字   define   sizeof   else   mic   seq   

原文地址:http://www.cnblogs.com/byene/p/6130192.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!