题目链接:http://acm.hust.edu.cn/vjudge/problem/28753
题意:给一个字符串,删除其中0个或多个字符,使得剩下的字母形成一个最长的回文串,输出字典序最小的。
思路:把字符串和它反向的字符串一起做一遍LCS。dp[i][j]表示从左边取i个字符,右边取j个字符的LCS。
回文串有两种:奇数长度和偶数长度的,我们分别枚举这两种情况更新答案。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <utility>
using namespace std;
#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)
#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 0x7fffffff
#define mod 100000007
const int maxn = 1009;
struct node
{
string str;
int L;
node()
{
L = 0;
str = "";
}
bool operator > ( const node &x )
{
if ( L != x.L ) return L > x.L;
return str < x.str;
}
}dp[maxn][maxn];
char A[maxn],B[maxn];
int n;
void init()
{
n = strlen(A+1);
rep(i,1,n) B[i] = A[n-i+1];
}
void update1( int l , int r , node &ans )
{
node temp;
temp.L = dp[l][r].L * 2;
if ( temp.L < ans.L ) return;
temp.str = dp[l][r].str;
Rrep(i,dp[l][r].L-1,0)
temp.str += dp[l][r].str[i];
if ( temp > ans ) ans = temp;
}
void update2(int mid,node &ans)
{
node temp;
temp.L = dp[mid-1][n-mid].L * 2 + 1;
if ( temp.L < ans.L ) return;
temp.str = dp[mid-1][n-mid].str;
temp.str += A[mid];
Rrep(i,dp[mid-1][n-mid].L-1,0)
temp.str += dp[mid-1][n-mid].str[i];
if ( temp > ans ) ans = temp;
}
void solve()
{
rep(i,0,n) dp[0][i].L = dp[i][0].L = 0 , dp[0][i].str = dp[i][0].str = "";
rep(i,1,n)
rep(j,1,n)
if ( A[i] == B[j] )
dp[i][j].L = dp[i-1][j-1].L + 1 , dp[i][j].str = dp[i-1][j-1].str + A[i];
else
{
if ( dp[i-1][j].L > dp[i][j-1].L )
dp[i][j] = dp[i-1][j];
else if ( dp[i-1][j].L < dp[i][j-1].L )
dp[i][j] = dp[i][j-1];
else dp[i][j] = dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
}
node ans;
rep(i,1,n-1) //偶数长度,分成两个区间
update1( i , n - i , ans );
rep(i,1,n) //奇数长度,i作为中间字符,分成两个区间
update2(i,ans);
cout<<ans.str<<endl;
}
int main()
{
while( gets(A+1) )
{
init();
solve();
}
return 0;
}