基本歸納法:對於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 利用動態規劃求解兩個陣列的最長哦公共子串行來求解這種題目,但只適用於求解最長遞增子串行的...