動態規劃 線性 DP 最大和問題

2021-09-12 14:05:02 字數 975 閱讀 7137

問題定義:對於給定序列 a1,a2,a3……an 尋找它的連續的最大和子陣列

用陣列 dp[i] 來儲存當前最大的連續子陣列,迴圈遍歷每個數,然後每次檢驗 dp[i-1] 是否大於零,只要大於零就令 dp[i] = dp[i-1]+a[i] ,如果 dp[i-1]<0 ,那麼直接令 dp[i]=a[i]

模板:

for(int i=2;i<=n;i++)

問題定義:給定乙個 n 行 m 列的整數矩陣 a,現在要求 a 的乙個子矩陣,使其各元素之和為最大。

最後子矩陣一定是在某兩行之間的,假設子矩陣在第 i 行和第 j 行之間,那麼我們可以列舉所有1<=i<=j<=m,表示最終子矩陣選取的行範圍。

將每一列第 i 行到第 j 行之間的和求出來,形成乙個陣列 c,於是乙個第 i 行到第 j 行之間的最大子矩陣和對應於這個和陣列 c 的最大子段和。

模板:

for(int i=1;i<=n;i++)

}int ans=-inf;

for(int i=1;i<=n;i++)

}}

數字三角形問題一般為:給出乙個如下形式的數字三角形,現在要從左上角走到第 i 行第 j 列,每一步只能走到相鄰的結點,求經過的結點的最大數字和

例如:7

3 88 1 0 

2 7 4 4

4 5 2 6 5

用 f[i][j] 表示第 i 行第 j 列的最大和,則有狀態轉移方程:f[i][j]=a[i][j]+max(f[i−1][j],f[i−1][j−1])

模板:

for (int i=n-1;i>=1;--i)

for (int j=1;j<=i;++j)

a[i][j]+=max(a[i+1][j],a[i+1][j+1]);

printf("%d\n",a[1][1]);

動態規劃 線性DP

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

動態規劃 線性 DP 序列問題

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

動態規劃 線性dp 初級

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