程式設計與演算法 動態規劃之最長公共子串行

2021-10-08 22:55:30 字數 911 閱讀 7921

乙個數的序列ai,當a17

1 7 3 5 9 4 8

輸出樣例

1.求子問題

求序列的前n個元素的最長上公升子串行的長度是個子問題,但是這樣分解子問題,不具有無後效性

假設f(n)=x,但可能有多個序列滿足f(n)=x。有的序列最後乙個元素比an+1小,則加上n+1就能形成更長的上公升子串行,有的序列最後乙個元素不比an+1小…以後的事情受如何達到狀態n的思想,不符合無後效性

求以ak(k=1,2,3,…n)為終點的最長上公升子串行的長度

乙個上公升子串行中最右邊的那個數,稱為該子串行的重點

雖然這個子問題和原問題形式上並不完全一樣,但是只要這個n個子問題都解決了,那麼這n個子問題的解中,最大的那個就是整個問題的解。

2.確定狀態

子問題只和乙個變數—數字的位置相關,因此序列中位置k就是狀態,而狀態k對應的值,就是以ak作為終點的最長上公升子串行的長度

狀態一共有n個

3.找出狀態轉移方程

maxlen(k)表示以ak作為終點的最長上公升子串行的長度,那麼

初始狀態maxlen(1)=1

maxlen(k)=max

//從每個元素開始遍歷,計算其最長上公升子串行的長度

for(

int i=

1;i}//找出整個陣列中最長的那個上公升子串行

int maxl=maxlen[0]

;for

(int i=

0;ireturn maxl;

}int

main()

cout<<

ascendlist

(a,n)

;return0;

}

動態規劃之最長公共子串行演算法

動態規劃之最長公共子串行演算法 演算法思想 假設x x1,x2,xm y static void init xy void getchar for i 1 i n i getchar static void lcs length void else if c i 1 j c i j 1 else p...

動態規劃之最長公共子串行 最長公共子串

題目 如果字串1的所有字元按其在字串中的順序出現在另外乙個字串2中,則字串1稱之為字串2的子串行。注意,並不要求子子串行 字串1 的字元必須連續出現在字串2中。請編寫乙個函式,輸入兩個字串,求它們的最長公共子串,並列印出最長公共子串行。例如 輸入兩個字串bdcaba和abcbdab,字串bcba和b...

動態規劃之最長公共子串行

最長公共子串行簡介 舉例說明並分析 塊測試結果 乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列,確切的說,若給定序列x 則另一串行z x的子串行是指存在乙個嚴格的下標序列,使得對於所有的j 0,1,k 1有zj xij。例如序列z 是序列x 的子串行,相應的遞增下標序列維。最長公共子串行問...