7-1 最长公共子序列 (20 分)
生活随笔
收集整理的這篇文章主要介紹了
7-1 最长公共子序列 (20 分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述:
從一個給定的串中刪去(不一定連續地刪去)0個或0個以上的字符,剩下地字符按原來順序組成的串。例如:“ ”,“a”,“xb”,“aaa”,“bbb”,“xabb”,“xaaabbb”都是串“xaaabbb”的子序列。(例子中的串不包含引號。)
編程求N個非空串的最長公共子序列的長度。限制:2<=N<=100;N個串中的字符只會是數字0,1,…,9或小寫英文字母a,b,…,z;每個串非空且最多含100個字符;N個串的長度的乘積不會超過30000。
輸入格式:
文件第1行是一個整數T,表示測試數據的個數(1<=T<=10)。接下來有T組測試數據。各組測試數據的第1行是一個整數Ni,表示第i組數據中串的個數。各組測試數據的第2到N+1行中,每行一個串,串中不會有空格,但行首和行末可能有空格,這些空格當然不算作串的一部分。
輸出格式:
輸出T行,每行一個數,第i行的數表示第i組測試數據中Ni個非空串的最長公共子序列的長度。
輸入樣例:
1 3 ab bc cd輸出樣例:
0參考代碼:
#include<stdio.h> #include<string.h> int max(a,b){return a>b?a:b;} int n,len[101],dp[30000]; char s[100][100]; int LCS(int *x) {int a,b,i,j;for(i=1;i<=n;i++){if(x[i]==0)return 0;}for(a=x[n]-1,i=n-1;i>=1;i--){a=a*len[i]+x[i]-1;}if(dp[a]>=0)return dp[a];for(i=2;i<=n;i++){if(s[1][x[1]-1]!=s[i][x[i]-1])break;}if(i>n){for(j=1;j<=n;j++){x[j]--;}b=LCS(x)+1;for(j=1;j<=n;j++){x[j]++;}}else{b=0;for(j=1;j<=n;j++){x[j]--;int t=LCS(x);b=max(b,t);x[j]++;}}dp[a]=b;return b; } int main() {int t,i,m[100];scanf("%d",&t);while(t--){scanf("%d",&n);for(i=1;i<=n;i++){scanf("%s",s[i]);len[i]=m[i]=strlen(s[i]);}memset(dp,-1,sizeof(dp));printf("%d\n",LCS(m));}return 0; }總結
以上是生活随笔為你收集整理的7-1 最长公共子序列 (20 分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抽象类(Java)
- 下一篇: 国家发改委发布《“互联网+”高效物流实施