题意:给你n个串(长度最多为1000),问对于每个串插入最少多少m个字符能使它变成一个回文串。输出m,并把回文串输出.
看了解题报告。总结,还要随便用memset,否则会T。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=1005; struct node { int cost,cmd; int x,y; void fz(int b,int c,int d){cmd=b;x=c;y=d;} }map[N][N]; int le,ri; char L[N],R[N],str[N]; int fun(int,int ); int print_ans(int,int); int main() { while(gets(str+1)) { le=0;ri=0; int len=strlen(str+1); printf("%d ",fun(1,len)); print_ans(1,len); L[le]='\0';printf("%s",L); for(int i=ri-1;i>=0;i--) putchar(R[i]); puts(""); for(int i=0;i<=len;i++) { for(int j=0;j<=len;j++) { map[i][j].cost=0; } } } return 0; } int fun(int x,int y) { if(x>=y){return 0;} else if(map[x][y].cost) return map[x][y].cost; else { if(str[x]==str[y]) { map[x][y].cost=fun(x+1,y-1); map[x][y].fz(3,x+1,y-1); } else { int temp1=fun(x,y-1)+1,temp2=fun(x+1,y)+1; if(temp1>temp2) { map[x][y].cost=temp2; map[x][y].fz(2,x+1,y); } else { map[x][y].cost=temp1; map[x][y].fz(1,x,y-1); } } return map[x][y].cost; } } int print_ans(int x,int y) { if(x==y) { L[le++]=str[x]; return 1; } if(map[x][y].cmd==1) { L[le++]=str[y]; R[ri++]=str[y]; } else if(map[x][y].cmd==2) { L[le++]=str[x]; R[ri++]=str[x]; } else if(map[x][y].cmd==3) { L[le++]=str[y]; R[ri++]=str[y]; if(x==y-1)return 1; } if(print_ans(map[x][y].x,map[x][y].y)) return 1; return 0; }