题目:
题解:
求对称最长公共子序列,将字符串反转,求LCS
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,dp[600][600];
char a[200][600],b[200][600];
struct node{
int ans;
string s;
}st[200];
int done(int x){
memset(dp,0,sizeof(dp));
int len=strlen(a[x]+1);
for(int i=1;i<=len;i++)
for(int j=1;j<=len;j++){
if(a[x][i]==b[x][j]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(max(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1]);
}
return dp[len][len];
}
bool cmp(node a,node b){
if(a.ans==b.ans) return a.s<b.s;
return a.ans>b.ans;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>a[i]+1;
int len=strlen(a[i]+1);
for(int j=1;j<=len;j++){
b[i][len-j+1]=a[i][j];
}
st[i].s=a[i]+1;
st[i].ans=done(i);
}
sort(st+1,st+n+1,cmp);
for(int i=1;i<=n;i++){
// printf("%d %d ",i,st[i].ans);
cout<<st[i].s<<'\n';
}
return 0;
}