UVa 11404 回文子序列(LCS求最長回文串長度)
阿新 • • 發佈:2017-07-18
ring vector 通過 spa include map 它的 思想 cstring
https://vjudge.net/problem/UVA-11404
題意:
給定一個由小寫字母組成的字符串,刪除其中的0個或多個字符,使得剩下的字母(順序不變)組成一個盡量長的回文串。如果有多解,輸出字典序最小的解。
思路:
首先,最長回文子串的長度可以通過正序字符串和逆序字符串進行LCS得出。
但是這道題目麻煩的是還要輸出這個回文串,並且字典序得最小。
應用的主要還是LCS的思想方法,不過在進行狀態轉移的時候,再加上字符串的狀態轉移。
不過最後得到的字符串不一定是回文串,但是它的前一半肯定是回文串的一半,那麽後面的一半只需要根據前面的就可以得出。
http://blog.csdn.net/shuangde800/article/details/9898675參考自該博客。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<sstream> 6 #include<vector> 7 #include<stack> 8 #include<queue> 9 #include<cmath> 10 #include<map> 11 #include<set> 12using namespace std; 13 typedef long long ll; 14 typedef pair<int,int> pll; 15 const int INF = 0x3f3f3f3f; 16 const int maxn = 1000 + 5; 17 18 char str1[maxn],str2[maxn]; 19 20 struct node 21 { 22 int len; 23 string str; 24 }f[maxn][maxn]; 25 26 int main() 27 { 28 //freopen("in.txt","r",stdin);29 while(gets(str1+1)) 30 { 31 int len = strlen(str1+1); 32 for(int i=len;i>=1;i--) 33 str2[i]=str1[len-i+1]; 34 35 for(int i=0;i<=len;i++) 36 { 37 f[0][i].len=0; 38 f[0][i].str=""; 39 } 40 41 for(int i=1;i<=len;i++) 42 { 43 for(int j=1;j<=len;j++) 44 { 45 if(str1[i]==str2[j]) 46 { 47 f[i][j].len=f[i-1][j-1].len+1; 48 f[i][j].str=f[i-1][j-1].str+str1[i]; 49 } 50 else 51 { 52 if(f[i][j-1].len > f[i-1][j].len) 53 { 54 f[i][j].len=f[i][j-1].len; 55 f[i][j].str=f[i][j-1].str; 56 } 57 else if(f[i][j-1].len < f[i-1][j].len) 58 { 59 f[i][j].len=f[i-1][j].len; 60 f[i][j].str=f[i-1][j].str; 61 } 62 else 63 { 64 f[i][j].len=f[i-1][j].len; 65 f[i][j].str=min(f[i-1][j].str,f[i][j-1].str); 66 } 67 } 68 } 69 } 70 71 int maxlen=f[len][len].len; 72 string line=f[len][len].str; 73 74 if(maxlen&1) 75 { 76 for(int i=0;i<=maxlen/2;i++) 77 printf("%c",line[i]); 78 for(int i=maxlen/2-1;i>=0;i--) 79 printf("%c",line[i]); 80 } 81 else 82 { 83 for(int i=0;i<maxlen/2;i++) 84 printf("%c",line[i]); 85 for(int i=maxlen/2-1;i>=0;i--) 86 printf("%c",line[i]); 87 } 88 printf("\n"); 89 } 90 return 0; 91 }
UVa 11404 回文子序列(LCS求最長回文串長度)