感觉转为LCS 其实就可以在弄一个数组,然后按照LCS的形式,,
但是错了。。
而且自己不会表示输出的答案序列。。
看了别人的。
他用的循环不太懂。。大概就是按照判断会问的思路
然后又看了别人的,感觉挺好http://blog.csdn.net/l123012013048/article/details/44493921
至少和LCS的代码像,注意答案是前半部分的重复
#include<bits/stdc++.h> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)); #define sf scanf #define pf printf #define bug1 printf("bug1\n"); #define N 1005 #define M 10 #define INF 1e9 #define LL long long #define inf 0x3f3f3f3f char s1[N],s2[N]; struct Node { string ans; int len; bool operator >(const Node&a){ if(this->len!=a.len)return this->len>a.len; return this->ans<a.ans; } }dp[N][N]; char ans[N][N]; int main(){ while(~sf("%s",s1+1)){ mem(ans,0); int len=strlen(s1+1); for(int i=1;i<=len;++i)s2[len-i+1]=s1[i]; for(int i=1;i<=len;++i){ dp[0][i].len=dp[i][0].len=0; dp[0][i].ans=dp[i][0].ans=""; } for(int i=1;i<=len;++i){ for(int j=1;j<=len;++j){ if(s1[i]==s2[j]){ dp[i][j].ans=dp[i-1][j-1].ans+s1[i]; dp[i][j].len=dp[i-1][j-1].len+1; } else { if(dp[i-1][j].len>dp[i][j-1].len){ dp[i][j].ans=dp[i-1][j].ans; dp[i][j].len=dp[i-1][j].len; } else if(dp[i-1][j].len<dp[i][j-1].len){ dp[i][j].ans=dp[i][j-1].ans; dp[i][j].len=dp[i][j-1].len; } else{ dp[i][j].ans=min(dp[i-1][j].ans,dp[i][j-1].ans); dp[i][j].len=dp[i][j-1].len; } } } } int Len = dp[len][len].len; string str = dp[len][len].ans; if(Len & 1) { int mid = Len / 2; for(int i = 0; i < mid; i++) cout << str[i]; for(int i = mid; i >= 0; i--) cout << str[i]; } else{ int mid = Len / 2; for(int i = 0; i < mid; i++) cout << str[i]; for(int i = mid-1; i >= 0; i--) cout << str[i]; } puts(""); } }