/* 题意: 给若干字符串,添加最少的字符把它们变成回文 ,并输出回文。 记忆化搜索,如果s[i]==s[j],dp[i][j]=dfs(i+1,j-1); 否则 dp[i][j]=min(dp[i][j],dfs(i+1,j),dfs(i,j-1); 最先开始也不造怎么输出,后来看了题解,递归输出 ,新姿势 = =。 */ #include<cstdio> #include<cstring> #include<algorithm> #define INF 0x3f3f3f3f using namespace std; int dp[1010][1010]; char s[1010]; int dfs(int l,int r) { if(l==r || r<l) return dp[l][r]=0; if(dp[l][r]!=INF) return dp[l][r]; if(s[l] == s[r]) dp[l][r]=dfs(l+1,r-1); else dp[l][r] = min( dp[l][r], min( dfs(l+1,r), dfs(l,r-1))+1); return dp[l][r]; } void print(int l,int r) { if(r<l) return ; if(l==r) { printf("%c",s[l]); return ; } if(s[l]==s[r]) { printf("%c",s[l]); print(l+1,r-1); printf("%c",s[l]); } else if(dp[l][r]==dp[l+1][r]+1) { printf("%c",s[l]); print(l+1,r); printf("%c",s[l]); } else { printf("%c",s[r]); print(l,r-1); printf("%c",s[r]); } } int main() { while(scanf("%s",s)!=EOF) { int l=strlen(s); memset(dp,INF,sizeof(dp)); dfs(0,l-1); printf("%d ",dp[0][l-1]); print(0,l-1); printf(" "); } return 0; }