動態規劃 線性 DP 序列問題

2021-09-12 14:05:02 字數 1054 閱讀 1850

子串行: 乙個序列 a=a1,a2,……an 中任意刪除若干項,剩餘的序列叫做 a 的乙個子串行。也可以認為是從序列 a 按原順序保留任意若干項得到的序列。(例如:對序列{1,3,5,4,2,6,8,7}來說,序列{3,4,8,7}是它的乙個子串行。)

公共子串行 :如果序列 c 既是序列 a 的子串行,也是序列 b 的子串行,則稱它為序列 a 和序列 b 的公共子串行。(例如:對序列{1,3,5,4,2,6,8,7}和序列{1,4,8,6,7,5}來說,序列{1,8,7}是它們的乙個公共子串行)

最長公共子串行:a 和 b 的公共子串行中長度最長的(包含元素最多的)序列叫做 a 和 b 的公共子串行。( 最長公共子串行不唯一)

對於乙個長度為 n 的序列,它一共有 2^n 個子序列,有 (2^n – 1) 個非空子序列。

子串行不是子集,它和原始序列的元素順序是相關的。

空序列是任何兩個序列的公共子串行。

角標為 0 時,認為子串行是空序列。

lis 問題(longest increasing subsequence),最長上公升子串行,其一般為求最長下降子串行或是最長上公升子串行。

用 dp[i] 表示 a[i] 為結尾的最長上公升子串行的長度,則有狀態轉移方程:

即:

模板:

char s[max],t[max];  

scanf("%s%s",s,t);

int x=strlen(s),y=strlen(t);

for(i=0;ilcis 問題(longest common increasing subsequence),求序列的最長公共上公升子串行。

用 f[i][j] 表示 a[1~j] 與 b[1~j] 可以構成的以 b[j] 為結尾的 lcis 的長度,易得狀態轉移方程:

因此對於決策集合中的元素只增多不減少的情景,就可以維護乙個變數來記錄決策集合的當前訊息,只需要兩重迴圈即可求解。

模板:for (int i=1;i<=n;++i)

}

動態規劃 線性DP

線性dp 即線性動態規劃,不侷限於 線性時間複雜度 的一維動態規劃。與數學中的 線性空間 類似,如果乙個動態規劃演算法的 狀態 包含多個維度,但在每個維度上都具有 線性 變化的 階段 那麼該動態規劃演算法同樣稱為 線性dp 在這類問題中,需要計算的物件表現出明顯的維度以及有序性,每個狀態的求解直接構...

動態規劃 線性dp 初級

攔截飛彈 洛谷p1020 飛彈攔截 o n logn 的解法 dilworth定理 定理1 令 x,是乙個有限偏序集,並令r是其最大鏈的大小。則x可以被劃分成r個但不能再少的反鏈。其對偶定理稱為dilworth定理 定理2 令 x,是乙個有限偏序集,並令m是反鏈的最大的大小。則x可以被劃分成m個但不...

動態規劃 線性dp 筆記

線性dp的經典問題 lis lcs 數字三角形。最長上公升子串行 lis 問題描述 給定乙個長度為n的數列a,求數值單調遞增的子串行的長度最長是多少。a的任意子序列可表示為b 其中k1最長公共子串行 lcs 問題描述 給定兩個長度分別為n和m的自負床a和b,求既是a的子串行又是b的子串行的字串長度最...