区间dp,加上方案打印
在方案打印这坑了很久,关键是找到一个清晰的算法而不是貌似可以的算法
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define MAX 1100
using namespace std;
char s[MAX];
int dp[MAX][MAX],len;
void print_ans(int l,int r,int ans){
if(l>=r){
if(l==r) printf("%c",s[l]);
return ;
}
if(dp[l+1][r-1]==ans && s[l]==s[r]){
printf("%c",s[l]);
print_ans(l+1,r-1,ans);
printf("%c",s[r]);
}else if(dp[l+1][r]==ans-1){
printf("%c",s[l]);
print_ans(l+1,r,ans-1);
printf("%c",s[l]);
}else if(dp[l][r-1]==ans-1){
printf("%c",s[r]);
print_ans(l,r-1,ans-1);
printf("%c",s[r]);
}
}
int main(){
while(cin>>s){
len=strlen(s);
memset(dp,0,sizeof(dp));
for(int l=2;l<=len;l++){
for(int i=0;i+l-1<len;i++){
if(dp[i][i+l-2]<dp[i+1][i+l-1]){
dp[i][i+l-1]=dp[i][i+l-2]+1;
}
else{
dp[i][i+l-1]=dp[i+1][i+l-1]+1;
}
if(s[i]==s[i+l-1]){
if(l==2&&0<dp[i][i+l-1]){
dp[i][i+l-1]=0;
}
else if(l>2&&dp[i+1][i+l-2]<dp[i][i+l-1]){
dp[i][i+l-1]=dp[i+1][i+l-2];
}
}
}
}
cout<<dp[0][len-1]<<" ";
print_ans(0,len-1,dp[0][len-1]);
cout<<endl;
}
return 0;
}