經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並
綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。
為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就
是動態規劃法所採用的基本方法。
遞推公式的推導
遞推公式的證明方法
**的寫法:把遞推公式直接寫進**即可
給出兩個字串,求出這樣的乙個最長的公共子串行的長度:子串行中的每個字元都能在兩個原串中找到,而且每個字元的先後順序和原串中的先後順序一致。
2、證明
s1[i-1]!= s2[j-1]時,maxlen(s1,s2)不會比maxlen(s1,s2j-1)
和maxlen(s1i-1,s2)兩者之中任何乙個小,也不會比兩者都大。
(1)不比任何乙個小:maxlen(s1,s2)字串長於後兩者
(2)也不會比兩者都大:反證法,假設比兩者都大:
若maxlen(s1,s2)比maxlen(s1,s2j-1)大,說明s2(j)這個字元與s1中的字元相等,並且s2(j)和這個相等的字元是最長公共子串行的最後乙個。
若maxlen(s1,s2)比maxlen(s1i-1,s2)大,說明s1(i)這個字元與s2中的字元相等,並且s1(i)和這個相等的字元是最長公共子串行的最後乙個。
上面兩種情況都是最長公共子串行的最後乙個,而這個最長公共子串行是maxlen(s1,s2)的最長公共子串行,所以最後乙個要相等。
那會得出s1[i]== s2[j]的結論,與假設衝突。
1/*2最長公共子串行
31、遞推公式:
4(分最後乙個相同和最後乙個不同來分析)
5當i或j等於0,maxlen(i,j)==0;
6當s1和s2的最後乙個字元相同時,maxlen(i,j)=maxlen(i-1,j-1)+1;
7當s1和s2的最後乙個字元不同時,maxlen(i,j) = max(maxlen(i,j-1),maxlen(i-1,j) );
82、證明
9s1[i-1]!= s2[j-1]時,maxlen(s1,s2)不會比maxlen(s1,s2j-1)
10和maxlen(s1i-1,s2)兩者之中任何乙個小,也不會比兩者都大。
11(1)不比任何乙個小:maxlen(s1,s2)字串長於後兩者
12(2)也不會比兩者都大:反證法,假設比兩者都大,那會得出s1[i-1]== s2[j-1]的結論,與假設衝突
133、**
14直接寫遞推公式就好了
15*/
16/*
17錯誤一:結果不對
18for(j=1;j<=length2;j++),漏了等號,所以都沒執行到這來,所以結果不對
19*/
20 #include 21 #include 22
using
namespace
std;
23char sz1[1000];//
字元陣列1
24char sz2[1000];//
字元陣列2
25int maxlen[1000][1000
];26
//maxlen(i,j)表示s1的左邊i個字元形成的子串,
27//
與s2左邊的j個字元形成的子串的最長公共子串行的長度(i,j從0開始算)
動態規劃 最長公共子串行
問題描述 我們稱序列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...
動態規劃 最長公共子串行
看完演算法導論關於這部分內容之後的總結 關於最長公共子串行問題 給定兩個子串行 x y 求x和y長度最長的公共子串行。解決方法 首先先要了解lcs的最優子結構,令x y 為兩個子串行,z 為x和y的任意lcs。1 如果 xm yn 則 zk xm yn 且 zk 1 是 xm 1 和 yn 1 的乙...