給定兩個序列,求兩個序列的最長公共子序列的長度(暫時先列出來長度好了……)
如此經典的DP,我竟然現在才弄明白,真心弱爆了,好吧,廢話不說了,開始吧。
對于兩個序列,dp[i][j]表示當第一個序列取前i個元素,第二個序列取前j個元素的時候,最長公共子序列的長度,那么對于此狀態,有如下幾種推導方式,假設第一個序列是X(x1,x2...xi),第二個序列是Y(y1,y2...yj),如果xi=yj,則dp[i][j]=dp[i-1][j-1]+1,否則,就等于dp[i-1][j]或者dp[i][j-1]。理由如下,假設X和Y的最長公共子序列為Z(z1,z2,...zk),如果xi=yj,必然有xi=yj=zk,如果xi≠yj,而且xi≠zk,則Z必然是Xi-1和Y的一個最長公共子序列,因為xi存在與否根本不影響最終的結果,而zk必然存在于X的前i-1個元素中,否則不成立,同理可運用于Y序列,所以可以得到推導關系。
剛剛把代碼YY出來,不知道對不對,希望某一個大牛出來指正一下……
特別鳴謝:磊哥ZLGG
如此經典的DP,我竟然現在才弄明白,真心弱爆了,好吧,廢話不說了,開始吧。
對于兩個序列,dp[i][j]表示當第一個序列取前i個元素,第二個序列取前j個元素的時候,最長公共子序列的長度,那么對于此狀態,有如下幾種推導方式,假設第一個序列是X(x1,x2...xi),第二個序列是Y(y1,y2...yj),如果xi=yj,則dp[i][j]=dp[i-1][j-1]+1,否則,就等于dp[i-1][j]或者dp[i][j-1]。理由如下,假設X和Y的最長公共子序列為Z(z1,z2,...zk),如果xi=yj,必然有xi=yj=zk,如果xi≠yj,而且xi≠zk,則Z必然是Xi-1和Y的一個最長公共子序列,因為xi存在與否根本不影響最終的結果,而zk必然存在于X的前i-1個元素中,否則不成立,同理可運用于Y序列,所以可以得到推導關系。
剛剛把代碼YY出來,不知道對不對,希望某一個大牛出來指正一下……
特別鳴謝:磊哥ZLGG
