子串是連續的
一:刻畫最優解結構特徵
用c[i,j]表示以a[i],b[j]結尾的最大公共子串中的字元數。則max(c[i,j]) (0<=i<=len(a)-1, 0<=j<=len(b)-1)表示a和b最大公共子串的字元數。同時在求解過程中可以確定i和j,這樣也就確定了這個公共子串。
二:遞迴定義最優解的值
c[i,j]=c[i-1,j-1]+1, (a[i] = b[j])
c[i,j] = 0, (a[i]<>b[j])
三:自底向上的方法
i和j遞增
四:構造最優解
確定i,j和c[i,j],也就能反推出最大公共子串
**如下:
#include
using namespace std;
#define max(x,y) ((x)>(y)?(x):(y))
int main()
;int b[10] = ;
int c[5][10];
memset(&c, 0, sizeof(c));
int q = -1;
for(int i = 0; i<5; i++)
else
q = max(q,c[i][j]); }}
cout } 給定兩個字串,str1 str2,求返回倆字串最長公共子串。分析 1 本題與求最長公共子串行相似,但又有所不同。在求子序列問題中,動態規劃通式i j位置的值取決於三個位置,dp i 1 j 1 dp i 1 j dp i j 1 三者中,2 先假設最後乙個字元相等,納入最長子序列中,那麼如果只改變乙... 1 兩個字串中最長公共子串行 該問題是動態規劃的經典問題,找出的公共序列不一定是連續的,參考資料很多,這裡就貼出公式和 做個簡單的筆記。設序列a,b的長度分別為n和m,l i,j 為a i b j 的最長公共子串行長度,有遞推公式 時間複雜度為o mn 如下 define n 50 intlcs c... 使用二維陣列c m,n c i,j 記錄序列xi和yj的最長公共子串行的長度 當i 0或j 0時,空序列是xi和yj的最長公共子串行,故c i,j 0 以上x和y進行一 一對比,a和b不相等,則比較它的左邊那個數和上邊那個數他們兩誰大 a和d比較,不相等,同理 直達a和a相比,相等,則它的左上角那個...1 8 動態規劃之最大公共子串問題。
最大公共子串行,最大公共子串,最大回文子串
動態規劃查詢最大公共子串行