問題定義:對於給定序列 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個但不...