dp專題 最長公共子串行

2021-08-13 10:26:07 字數 2099 閱讀 8587

最長公共子串行

題目描述

乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列。確切地說,若給定序列x1,x2,…,x,則另一串行z1,z2,…,zk是x的子串行是指存在乙個嚴格遞增的下標序列使得對於所有j=1,2,…,k有:

x例如,序列zb,c,d,b是序列xa,b,c,b,d,a,b的子串行,相應的遞增下標序列為2,3,5,。給定兩個序列x和y,當另一串行z既是x的子串行又是y的子串行時,稱z是序列x和y的公共子串行。例如,若a,b,c,b,d,a,b>和yb,d,c,a,b,a,則序列b,c,a是x和y的乙個公共子串行,序列 b,c,b,a也是x和y的乙個公共子串行。而且,後者是x和y的乙個最長公共子串行.因為x和y沒有長度大於4的公共子串行。

給定兩個序列x1,x2,…,xm和y1,y2….yn.要求找出x和y的乙個最長公共子串行。

輸入輸入共有兩行。每行為乙個由大寫字母構成的長度不超過200的字串,表示序列x和y。

輸出輸出第一行為乙個非負整數。表示所求得的最長公共子串行的長度。若不存在公共子串行.則輸出檔案僅有一行輸出乙個整數0。否則在輸出檔案的第二行輸出所求得的最長公共子串行(也用乙個大寫字母組成的字串表示)。若符合條件的最長公共子串行不止乙個,只需輸出其中任意的乙個。

樣例輸入

abcbdab

bdcaba

樣例輸出

4 bcba

題目解析:

題目求最長公共子串行,子串行是不用連續的,意思就是說

字串abcd和 awbwcwdw 如果看連續的子串行的話那最長的為1的字元,四個長度為1的子串行,但是無需連續的話就有乙個最長的子串行為4 也就是abcd;

dp一般都有乙個陣列儲存狀態,這個也有,c[i][j],二維陣列,第一維表示的是第乙個字串,第二維表示的是第二個字串,i和j的意思就是所屬的字串的位置,陣列裡面存的是第乙個字串中前i個字元和第二個字串前j個字元的最長子序列的長度,就比如abcd和awbwcwdw c[1][1]=1;c[1][2]=1;c[1][3]=1;——

c[2][2]=1;c[2][3]=2—;

如果有個過程可以實現這個,那按照這個趨勢到每個字串的最後乙個字元就不就是所要的答案嗎,也就是二個完整的字串的最長子序列;

在這個過程中肯定需要判斷,二個字元要不是相同要不就是不相同,那就分類討論;

首先,當我們比較二個字串中其中乙個字元時,假如他們相等,假如此時i=5 ,j=6;也就是第乙個字串的第5個字元和第二個字串的第6個字元相同,那我們只需要知道在他們之前的狀態最長子序列是多長再加上此時的1 就是這個位置的最長子序列了;

假如二個字元不相同比較的時候,那我們就需要考慮他之前的狀態了,既然不相同那就是等於他之前的狀態,無需加一,可以把不相同當做多餘來理解,也就是說,在這個子串行中加上了這個字元,長度沒有增加,但是我們在比較的時候是二個字元在比較,你怎麼知道是哪個字元沒有用呢,由之前的定理得,不相同的時候等於他之前的子串行長度,所以我們只需比較對於這個字元來說他的之前狀態和另乙個字元的之前狀態,看看誰的子串行長那就可以看誰更沒用了,選那個相對有用的就行了,比的時候假裝那乙個字元是沒用的,比如i=5是沒用的,那他的之前狀態就是i=4,j=6時,假如另乙個沒用,那就是i=5.j=5,比較得到大的最為此時的狀態;

另外還需初始化;當其實乙個字串是0位置的時候,都是0,因為,乙個是空的怎麼可能有相同的;

**:

#include

#include

char a[1005];

char b[1005];

int c[1005][1005];

#define max(x,y) x>y?x:y

int main()

else

}if(c[qq][pp]==0)

printf("0");

else

printf("%d\n",c[qq][pp]);

char d[1005];

int up=qq-1,down=pp-1;

int w=c[qq][pp];

while(w!=0)

else

else

if(c[up][down+1]1][down])

else}}

if(c[qq][pp]!=0)

}

DP 最長公共子串行

解題報告 題目 演算法 dp 最長公共子串行 思路 最長公共子串行,英文縮寫為lcs longest common subsequence 其定義是,乙個數列 s 如果分別是兩個或多個已知數列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。d i j 表示s1的第i位...

最長公共子串行 DP

有序子串行定義 若x 則它的子串行為y 即原序列調出若干項組成的序列且下標要求有序。lcs 最長公共子串行 定義 給定兩個序列x 和y 存在乙個嚴格遞增的x的下標序列為,對所有的j 1,2,3.k,滿足xi yj,例如x 1 4 3 2 5 y 4 3 5 7 則x和y的最長公共子串行為 4 3 5...

最長公共子串行 DP

最長公共子串行 lcs.pas c cpp 問題描述 乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列。確切地說,若給定序列x x1,x2,xm 則另一串行z z1,z2,zk 是x的子串行是指存在乙個嚴格遞增的下標序列 i1,i2,ik 使得對於所有j 1,2,k有 xij zj 例如,序...