1. 程式人生 > >NYOJ 036 最長公共子序列(dp )

NYOJ 036 最長公共子序列(dp )

描述
咱們就不拐彎抹角了,如題,需要你做的就是寫一個程式,得出最長公共子序列。
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;
}