標籤: c語言
動態規劃x
2017-04-08 22:36
358人閱讀收藏
舉報
演算法(8)
目錄(?)
[+]
給定兩個序列,求出它們的最長公共子串行。如:序列x=,y=,則x和y的最長公共子串行為
設兩個序列分別是x=,y=,它們的最長公共子串行為z=。若xm=yn,則先求xm-1和yn-1的最長公共子串行,再在其尾部加上xm即可得xm和yn的最長公共子串行。
若xm!=yn,則必須分別求xm、yn-1和xm-1、yn的最長公共子串行,其中較長者就是xm和yn的最長公共子串行。
將c陣列的第0行、第0列初始化為0;
從c陣列的第一行、第一列開始,依次從左向右、從上到下填充元素值:
a)若x[i]==y[j],則c[i][j]=c[i-1][j-1]+1,s[i][j]=1;
b)若x[i]!=y[j],則分別計算c[i][j-1]、c[i-1][j],將大的那個作為c[i][j];並且,如果c[i-1][j]>=c[i][j-1],則s[i][j]=2;如果c[i-1][j]< c[i][j-1],則s[i][j]=3;
private
int c;
private
int s;
void lcslength(string a, string b)
for( int i=0; i0][i] = 0;
}// 從上到下、從左到右填充c、s陣列
for( int i=1; ifor( int j=1; jif( x[i]==y[j] )
else
if ( c[i-1][j] >= c[i][j-1] )
else }}
}
stringbuilder sb = new stringbuilder();
void clcs( int i, int j )
else
if ( s[i][j]==2 )
else
}
最長公共子串行 最長公共子串
1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...
最長公共子串行 最長公共子串
1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...
最長公共子串 最長公共子串行
子串要求連續 子串行不要求連續 之前的做法是dp求子序列 include include include using namespace std const int inf 0x3f3f3f3f const int mod 1000000007 string s1,s2 int dp 1010 10...