序列序列如果存在乙個序列其中 ,且在**現的先後順序要保持一致,則稱序列是序列和序列的公共子串行。
要求找出序列和序列的最長的公共子串行。
序列,序列。
序列的子串行有:
序列的子串行有:
序列和的公共子串行有:
所以序列和的最長公共子串行是:
序列,序列。
假設序列是兩個序列的最長公共子串行,則有以下推論:
記為序列和序列的最長公共子串行(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 第二行輸出該子串行...