NYOJ 036 最長公共子序列(dp )
阿新 • • 發佈:2019-02-10
- 描述
- 咱們就不拐彎抹角了,如題,需要你做的就是寫一個程式,得出最長公共子序列。
tip:最長公共子序列也稱作最長公共子串(不要求連續),英文縮寫為LCS(Longest Common Subsequence)。其定義是,一個序列 S ,如果分別是兩個或多個已知序列的子序列,且是所有符合此條件序列中最長的,則 S 稱為已知序列的最長公共子序列。- 輸入
- 第一行給出一個整數N(0<N<100)表示待測資料組數
接下來每組資料兩行,分別為待測的兩組字串。每個字串長度不大於1000. - 輸出
- 每組測試資料輸出一個整數,表示最長公共子序列長度。每組結果佔一行。
- 樣例輸入
-
2 asdf adfsd 123abc abc123abc
- 樣例輸出
-
3 6
ac程式碼
#include<stdio.h> #include<string.h> int main() { int n,i,j; char s1[1005],s2[1005]; int v[2000];//記錄長度 int len1,len2;//字串長度 int num,temp;//標記 scanf("%d",&n); while(n--) { scanf("%s%s",s1,s2); memset(v,0,sizeof(v));//初始化長度計量 len1=strlen(s1); len2=strlen(s2); for(i=0;i<len1;i++) { num=0;//每次都是從0開始遍歷 for(j=0;j<len2;j++) { temp=v[j];//變化temp的值 //為後面的num賦值 if(s1[i]==s2[j]) v[j]=num+1;//如果相等,直接加一 else if(v[j]<v[j-1]) v[j]=v[j-1];//不相同時,向前遞推賦值 num=temp; } //可以保證最後一個的V值是最大的相同子串長度 } printf("%d\n",v[len2-1]); } return 0; }