最長公共上公升子串行 動態規劃解最長公共子串行問題

2021-10-12 18:27:16 字數 2530 閱讀 6758

序列序列如果存在乙個序列其中  ,且在**現的先後順序要保持一致,則稱序列是序列和序列的公共子串行。

要求找出序列和序列的最長的公共子串行。

序列,序列。

序列的子串行有:

序列的子串行有:

序列和的公共子串行有:

所以序列和的最長公共子串行是:

序列,序列。

假設序列是兩個序列的最長公共子串行,則有以下推論:

記為序列和序列的最長公共子串行(lcs)的長度。根據上述推論,可以得到的遞推公式:

在求最長公共子串行長度矩陣的時候,需要借助乙個輔助矩陣來記錄求得的過程:

在求得最長公共子串行以及輔助矩陣之後,即可使用回溯法來得到所有的最長公共子串行。

# ifndef _lcs_h

# define _lcs_h

# include 

using namespace std;

/***  序列類

*/class seq

};// lcs類

class lcs;

#endif

# include "lcs.h"

#include 

# include 

#include 

using namespace std;

/*** 動態規劃法求最長公共子串行長度矩陣c以及輔助矩陣

* 輸入是兩個序列

*/void lcs::writetable(seq* seq1,seq* seq2)

//計算c矩陣和輔助矩陣src

for(int i=0;i        for(int j=0;j            if(i==0||j==0)else if(seq1->data[i-1]==seq2->data[j-1])elseelse if(c[i-1][j]-1])else}}

}    

}/**

* 判斷子串行是否和已有的子串行重複

* 輸入:lcsset為已有的子串行集合,lcs為待加入的子串行

* 輸出:若重複返回true,否則false

*/bool isrepeat(vector>lcsset,vectorlcs)for(int j=0;j            if(lcs.at(j)!=lcsset.at(i).at(j))

}if(flag==0)

flag=0;

}return false;

}/**

* 使用回溯法來找出所有的最長公共子串行,此處使用輔助矩陣src完成,用到遞迴程式設計技巧

* seq1是第乙個序列,與c[i][j]的i對應;lcs是最長公共子串行;i,j是下標;maxlen是最長公共子串行的長度;lcsset是最長公共子串行的集合

*/void lcs::createsubseq(seq* seq1,vectorlcs , int i,int j,int maxlen,vector>&lcsset)

}return;

}switch (src[i][j])

}vector> lcs::getlcs(seq* seq1,seq* seq2)

writetable(seq1,seq2);vectorlcs;vector> lcsset;

createsubseq(seq1,lcs,seq1->len,seq2->len,c[seq1->len][seq2->len],lcsset);return lcsset;

}

#include "lcs.h"

#include 

#include 

using namespace std;

void test1(),7);

seq seq2 = seq(new int[9],9);

vector> lcsset= lcs->getlcs(&seq1,&seq2);

printf("nums of lcs : %d\n",lcsset.size());

for(int i=0;i        for(int j=0;j            printf("%d ",lcsset.at(i).at(j));

}printf("\n");}}

int main()

flag= -std=c++11 

libs= 

act:test.o  lcs.o

g++ -o act test.o lcs.o $(flag) $(libs)

test.o:test.cpp 

g++ -c test.cpp  $(flag)

lcs.o:lcs.cpp lcs.h

g++ -c lcs.cpp $(flag)

動態規劃 最長公共上公升子串行

對於做dp的人而言,規劃處最優子結構是解決一切題目的第一步,二此題的最優越子結構規劃一下,dp i j 為序列1前i個元素和序列2前j個元素最長公共上公升子串行多長。那麼這個時候初始值初始化為0的話,碰到序列1和序列2相等的情況只要依靠相等位置前的序列來得出狀態即可,更新完整個dp陣列。如下 inc...

動態規劃 最長公共上公升子串行LCIS

問題 給定兩個序列a和b,序列的子串行是指按照索引逐漸增加的順序,從原序列中取出若干個數形成的乙個子集,若子串行的數值大小是逐漸遞增的則為上公升子串行,若a和b取出的兩個子串行a1和b1是相同的,則a1 b1為a和b的公共子串行。求出a和b的最長公共上公升子串行。分析 if a i b j dp i...

最長公共上公升子串行

題目描述 給定兩個整數序列,求它們的最長上公升公共子串行。輸入描述 輸入兩組資料,每組資料代表乙個整數序列,其輸入格式為 第一行輸入長度m 1 m 500 第二行輸入該序列的m個整數ai 231 ai 231 輸出描述 輸出共兩行。第一行輸出兩個序列的最長上公升公共子串行的長度l 第二行輸出該子串行...