Palindromic Subsequence
A Subsequence is a sequence obtained by deleting zero or more characters in a string. A Palindrome is a string which when read from left to right, reads same as when read from right to left. Given a string, find the longest palindromic subsequence. If there are many answers to it, print the one that comes lexicographically earliest.
Constraints
- Maximum length of string is 1000.
- Each string has characters `a' to `z' only.
Input
Input consists of several strings, each in a separate line. Input is terminated by EOF.
Output
For each line in the input, print the output in a single line.
Sample Input
aabbaabb computer abzla samhita
Sample Output
aabbaa c aba aha
题意:找到最长的非连续回文字串,并输出字典序最小的。
思路:dp[i][j].num表示从i到j的回文串的最大字符数,dp[i][j].str表示这个最小的字符串,每次如果s[i]==s[j]时,那么两端必取这两个字符,否则的话,取dp[i+1][j]和dp[i][j-1]中字符串字典序最小的。
AC代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
struct node
{
int num;
string str;
}dp[1010][1010];
char s[1010],c;
int n;
int main()
{
int i,j,k,p;
while(gets(s+1))
{
n=strlen(s+1);
if(n==0)
{
printf("\n");
continue;
}
for(i=1;i<=n;i++)
{
dp[i][i].num=1;
dp[i][i].str=s[i];
dp[i][i-1].str="";
}
for(k=1;k<=n;k++)
for(i=1;i+k<=n;i++)
{
j=i+k;
dp[i][j].num=max(dp[i+1][j].num,dp[i][j-1].num);
if(s[i]==s[j])
{
dp[i][j].num=max(dp[i][j].num,dp[i+1][j-1].num+2);
dp[i][j].str=s[i]+dp[i+1][j-1].str+s[i];
continue;
}
if(dp[i][j].num==dp[i+1][j].num && dp[i][j].num==dp[i][j-1].num)
{
dp[i][j].str=min(dp[i+1][j].str,dp[i][j-1].str);
continue;
}
if(dp[i][j].num==dp[i+1][j].num)
dp[i][j].str=dp[i+1][j].str;
else if(dp[i][j].num==dp[i][j-1].num)
dp[i][j].str=dp[i][j-1].str;
}
cout<<dp[1][n].str<<endl;
}
}