最長公共子串行1:
所有的回溯找路徑:記錄之前來的路徑
找兩個字串的最長公共子串行
char s1[maxlen]=;
char s2[maxlen]=;
答案為4
遞推公式:
回溯路徑:
最長公共子串行2:回溯法求路徑
3所有的回溯找路徑:記錄之前來的路徑
41、遞推公式:
5(分最後乙個相同和最後乙個不同來分析)
6當i或j等於0,maxlen(i,j)==0;
7當s1和s2的最後乙個字元相同時,maxlen(i,j)=maxlen(i-1,j-1)+1;
8當s1和s2的最後乙個字元不同時,maxlen(i,j) = max(maxlen(i,j-1),maxlen(i-1,j) ); 9*/
10/*
11因為區域性變數是在棧中的,所以像這樣用函式傳引數的話,陣列不能太大
12現在這裡maxlen是100,可以,是1000的話就會出問題
13解決方法:陣列可以寫成全域性變數
14*/
15 #include 16 #include 17
#define maxlen 100
18using
namespace
std;
19//
求s1和s2的最長公共子串行
20void lcslength(char *s1,char *s2,int length1,int length2,int dp[maxlen],int
pre[maxlen])
34//
當s1和s2的最後乙個字元不同時,dp(i,j) = max(dp(i,j-1),dp(i-1,j) );
35else
if(dp[i-1][j]>=dp[i][j-1])
39else
43}
4445}46
}47//列印s1和s2的最長公共子串行
48void printlcs(int pre[maxlen],char *s1,int i,int
j)57
else
if(pre[i][j]==1)61
else
65}
6667
intmain();
69char s2[maxlen]=;
70/*
71dp[maxlen][maxlen]表示進行動態規劃運算的陣列,
72dp(i,j)表示s1的左邊i個字元形成的子串,
73與s2左邊的j個字元形成的子串的最長公共子串行的長度(i,j從0開始算)
74*/
75int
dp[maxlen][maxlen];
76//
pre[i][j]用於記錄ij位置的最長公共子串行是從哪個位置推導出來的
77int
pre[maxlen][maxlen];
78int length1=strlen(s1);//
求字元陣列s1的長度
79int length2=strlen(s2);//
求字元陣列s2的長度
80 lcslength(s1,s2,length1,length2,dp,pre);//
求s1和s2的最長公共子串行
81 cout/
輸出s1和s2的最長公共子串行的長度
82 printlcs(pre,s1,length1,length2);//
列印s1和s2的最長公共子串行
動態規劃2 最長公共子串行
問題是給定字串x和y,求出兩個當中最長的公共子串行。比如x abcdef y acefg,那麼他們的最長公共子串行就是acef。就是求x的所有可能的子字串與y所有的子字串匹配,如果相同,那麼就是乙個公共子串行,然後求最長的乙個。建議 上面的公開課,講的非常好。本文思路是根據上面的公開課總結實踐的。我...
動態規劃 最長公共子串行
問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上公升的序列 i1,i2,ik 使得對j 1,2,k,有xij zj。比如z a,b,f,c 是x a,b,c,f,b,c 的子串行。現在給出兩個序列x和y,你的任務是找到x和y的最大公共子串行,也就是說要...
動態規劃 最長公共子串行
兩個序列的最長公共子序 lcs longest common length 的 每個字元可以不連續,如x y 那麼它們的最長公共子串行為。這是乙個經典的動態規劃問題,著手點還是找到 最精髓的 狀態轉移方程 假設x,y兩個序列的前i,j個位置的最大子串行已經找到為r i j 自底往上 那麼x i 與y...