1. 程式人生 > >【Vijos 1327】回文詞(DP)

【Vijos 1327】回文詞(DP)

字符串 表示 spa 從右到左 最長公共子序列 jos oid cst 數字

題目描述

回文詞是一種對稱的字符串——也就是說,一個回文詞,從左到右讀和從右到左讀得到的結果是一樣的。任意給定一個字符串,通過插入若幹字符,都可以變成一個回文詞。你的任務是寫一個程序,求出將給定字符串變成回文詞所需插入的最少字符數。
比如字符串“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)