動態規劃之最長遞增子串行

2021-07-11 20:16:45 字數 947 閱讀 6406

基本歸納法:對於ai+1,只要考察其前乙個狀態ai即可完成整個推理過程,它的特點是只要ai確定,則計算ai+1便不需要考察前序狀態a0....ai-1,我們將這一模型稱之為馬爾科夫模型

高階歸納法:相應的,對於ai+1,考察前i個狀態集才可完成整個推理過程,往往稱之為高階馬爾科夫模型

在計算機演算法中,高階馬爾科夫模型的推理叫做「動態規劃」,馬爾科夫模型的推理叫做「貪心法」

例:lis(longest   increasing  subsequence),給定長度為n的陣列a,計算a的最長單調遞增子串行(不一定連續)。

如:給定陣列a,則a的lis為;長度為4

方法一:用lcs解決lis,即將給定陣列排序,排序後的陣列與原陣列的最長公共子串行即為最長遞增子串行

方法二:動態規劃:

思想:array14

6289

7lis12

3245

? 長度為n的陣列記為a;

記前n個字元構成的字首串為ai = a0a1...ai-1,以ai結尾的的最長遞增子串行為li,其長度記為b[i];

假設已經得到了b[0,1....i-1],如何計算得到bi?

如果將ai綴到l0 l1....lii後面,是否允許呢?

易知如果a[i]>a[j],則可以將a[i]綴到l[j]的後面,得到比l[j]更長的子串行,從而b[i] =

}nlis = max(nlis,longest[i]);

}delete longest;

return nlis;

}如果是想要求出該最長子序列呢?很簡單,記錄前驅即可。

int lis(int *p,int *pre;int length)

{ int longest[length];

int i,j;

int nindex = 0;

for(i=0;ip[j])

{if(longest[i]

動態規劃之最長遞增子串行

面試經常出現問題 最長遞增子串行問題是乙個很基本 較常見的小問題,但這個問題的求解方法卻並不那麼顯而易見,需要較深入的思考和較好的演算法素養才能得出良好的演算法。由於這個問題能運用學過的基本的演算法分析和設計的方法與思想,能夠鍛鍊設計較複雜演算法的思維,我對這個問題進行了較深入的分析思考,得出了幾種...

動態規劃之最長遞增子串行

1 問題描述 給定乙個序列arr,假設全是整數,給出最長的乙個遞增子串行,比如輸入arr 2,1,5,3,6,4,8,9,7 輸出 1,3,4,8,9 4 下面是 include includeusing namespace std int main 首先計算出以第i個位置結尾的最長遞增子串行的大小...

動態規劃之最長遞增子串行LIS

子串行 乙個序列 s 任意刪除若干項,剩餘的序列叫做s的乙個子串行。也可以認為是從序列s按原順序保留任意若干項得到的序列。現在我們要求解乙個陣列裡最長遞增子串行的長度。在此我提出兩種方法,並且附上 解決方法 1 利用動態規劃求解兩個陣列的最長哦公共子串行來求解這種題目,但只適用於求解最長遞增子串行的...