1. 程式人生 > >Generating Palindromes LightOJ - 1033

Generating Palindromes LightOJ - 1033

col cas sca string mes strlen cnblogs tdi blank

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\n",TT,get(1,strlen(a+1))); 23 } 24
return 0; 25 }

Generating Palindromes LightOJ - 1033