51nod1006最長公共子串行Lcs問題

2021-07-09 20:15:58 字數 1274 閱讀 8230

給出兩個字串a b,求a與b的最長公共子串行(子串行不要求是連續的)。

比如兩個串為:

abcicba

abdkscab

ab是兩個串的子串行,abc也是,abca也是,其中abca是這兩個字串最長的子串行。

input

第1行:字串a

第2行:字串b

(a,b的長度 <= 1000)

output

輸出最長的子串行,如果有多個,隨意輸出1個。
input示例

abcicba

abdkscab

output示例

abca

解題思路:動態規劃,尋找上一次的最優解進行累計。。。

a串與b串進行比較,當a==b時dp[i][j] = dp[i-1][j-1]+1;

當a!=b時dp[i][j] = max(dp[i-1][j],dp[i][j-1]);

形成一種三角選擇。

列印最長子序列時也是個問題!

再定義的乙個與dp相同的陣列visit,用於記錄是什麼狀態儲存個數的 即:

dp[i][j] = dp[i-1][j-1]+1;  visit[i][j] = 0;  將+1的狀態全部設為0

dp[i][j] = max(dp[i-1][j],dp[i][j-1]): dp[i][j] = dp[i-1][j];visit[i][j] = 1;

dp[i][j] = dp[i][j-1];visit[i][j] = -1;

總共3種情況,逐一標記。

然後利用遞迴尋找visit中0的情況輸出,並且利用標記的0,1,-1來分別控制遞迴的方向。

即0:(x-1,y-1)     1:(x-1,y)     -1

:(x,y-1)

這裡遞迴倒著尋找,是因為要正的輸出。

參考  :

#include #include int dp[1001][1001],len_a,len_b,visit[1001][1001];

char a[1001],b[1001];

void printlcs(int x,int y)

else if(visit[x][y] == 1)

else

return;

}int main()

else}}

}printlcs(len_a,len_b);

printf("\n");

}return 0;

}

51Nod 1006 最長公共子串行Lcs(DP)

給出兩個字串a b,求a與b的最長公共子串行 子串行不要求是連續的 比如兩個串為 abcicba abdkscab ab是兩個串的子串行,abc也是,abca也是,其中abca是這兩個字串最長的子串行。input 第1行 字串a 第2行 字串b a,b的長度 1000 output 輸出最長的子串行...

51nod 1006 最長公共子串行Lcs

給出兩個字串a b,求a與b的最長公共子串行 子串行不要求是連續的 比如兩個串為 abcicba abdkscab ab是兩個串的子串行,abc也是,abca也是,其中abca是這兩個字串最長的子串行。input 第1行 字串a 第2行 字串b a,b的長度 1000 output 輸出最長的子串行...

51nod1006 最長公共子串行Lcs

思路 定義dp i j 為a串以i結尾,b串為j結尾的子串行的最長公共子串行長度,則 if a i a j dp i j dp i 1 j 1 1,else dp i j max dp i 1 j dp i j 1 這題的話 還需要記錄長度為dp i j 的公共子串行選自哪些位置,詳情看 ac 我的...