【Vijos 1327】回文詞(DP)
阿新 • • 發佈:2018-09-15
字符串 表示 spa 從右到左 最長公共子序列 jos oid cst 數字
比如字符串“Ab3bd”,在插入兩個字符後可以變成一個回文詞(“dAb3bAd”或“Adb3bdA”)。然而,插入兩個以下的字符無法使它變成一個回文詞。
第二行是一個長度為N的字符串,字符串由大小寫字母和數字構成。
一個整數,表示需要插入的最少字符數。
題目描述
回文詞是一種對稱的字符串——也就是說,一個回文詞,從左到右讀和從右到左讀得到的結果是一樣的。任意給定一個字符串,通過插入若幹字符,都可以變成一個回文詞。你的任務是寫一個程序,求出將給定字符串變成回文詞所需插入的最少字符數。比如字符串“Ab3bd”,在插入兩個字符後可以變成一個回文詞(“dAb3bAd”或“Adb3bdA”)。然而,插入兩個以下的字符無法使它變成一個回文詞。
輸入
第一行包含一個整數N,表示給定字符串的長度,3<=N<=5000第二行是一個長度為N的字符串,字符串由大小寫字母和數字構成。
輸出
把字符串反轉之後求兩個的最長公共子序列,答案就是數組長度減去最長公共子序列的長度。
1 #include <cstring> 2 #include <cstdio> 3 4 int n,ans,x[5001],y[5001]; 5 char s1[5000],s2[5000]; 6 #define max(x,y) (x>y?x:y) 7 8 int main(void){ 9 scanf("%d%s",&n,&s1); 10 for(int i=0;i<n;++i)11 s2[n-i-1]=s1[i]; 12 for(int i=0;i<n;++i){ 13 int s=0; 14 for(int j=0;j<n;j++){ 15 if(s1[i]==s2[j]) 16 x[j]=s+1; 17 s=max(s,y[j]); 18 } 19 memcpy(y,x,(sizeof(x))); 20 } 21 for(int i=0;i<n;i++)22 ans=max(ans,x[i]); 23 printf("%d",n-ans); 24 }
【Vijos 1327】回文詞(DP)