Generating Palindromes LightOJ - 1033
题意:添加最少的字符使得给出的字符串成为回文串。输出添加的字符数。
方法:常规区间dp。ans[i][j]表示使得ans[i][j]成为回文串最少添加的字符数。如果i和j位置的字符相等那么ans[i][j]=ans[i+1][j-1],否则要么左边去掉一个,要么右边去掉一个,就是$min(get(l,r-1),get(l+1,r))+1$。
错误记录:和cf607b以及poj1141搞混。那两道题不需要添加字符成为回文串,只需要配对。也就是多个回文串并列也可以,不一定要整个回文串。这道题不一样。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 char a[201]; 6 int n,y,T,TT; 7 int ans[201][201]; 8 int get(int l,int r) 9 { 10 if(l>=r) return 0; 11 if(ans[l][r]!=0x3f3f3f3f) return ans[l][r]; 12 if(a[l]==a[r]) return ans[l][r]=get(l+1,r-1); 13 return ans[l][r]=min(get(l,r-1),get(l+1,r))+1; 14 } 15 int main() 16 { 17 scanf("%d",&T); 18 for(TT=1;TT<=T;TT++) 19 { 20 scanf("%s",a+1); 21 memset(ans,0x3f,sizeof(ans)); 22 printf("Case %d: %d ",TT,get(1,strlen(a+1))); 23 } 24 return 0; 25 }