線性dp之最大子段和問題小結

2021-10-06 10:17:52 字數 890 閱讀 5368

我們知道線性dp中一道典中典的題目就是求最大子段和;

狀態方程為:dp[i]=max(dp[i]+a[i],a[i]);

當然這只是最基礎的,還有很多擴充套件;

子段長度不大於m的最大子段和

這個時候dp已經不好用了,可以考慮字首和sum[i],維護min(sum[k])(i-m<=k子段長度不小於m的最大子段和

(1)第一種方法,先用dp計算一次沒有長度限制的最大子段和,然後

f[i]=dp[i-1]+sum[i+m]-sum[i-1],最後對每乙個f[i]求乙個max;這個就是相當於在每個dp[i-1]後面加乙個長度為m的段;

(2)直接維護min(sum[k])(1<=k<=i−m),這個維護就不要單調佇列,直接一遍迴圈維護就行;

環狀最大子段和

(1)破環為鏈(長度擴大兩倍),然後維護乙個長度不大於m(m為環的長度)的最大子段和

(2)這種方法在後面求兩段和也要用到,非常重要;

就是考慮這個子段是否經過連線點(就是同時經過a[1]和a[n]),如果經過,可以求1-n的最小子段和,然後總和減去這個最小子段和;如果不經過,就直接求1-n的最大子段和就可以;

環狀最大兩段子段和

就是第3種的乙個擴充套件,求兩段,只要正向反向維護乙個最大子段和就可以;

具體講一下,為什麼經過連線點要那樣算?

可以發現環狀的最大子段和要不就是-----++++ ----++++ ----(把環拆成鏈,長度沒有擴大兩倍,加號代表該位置取,減號代表不取),要不就是++++ ------++++ ----+++,也就是說要不就經過連線點,要不就不經過;

如果不經過,那麼和普通的線性沒區別;如果經過,那麼就有三段子段和,不好求,正難則反,所以只要求最小子段和就可以了;

題目:洛谷·p1121 環狀最大兩段子段和

動態規劃之最大子段和問題

問題描述 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。當所有整數均為負值時定義其最大子段和為0。依此定義,所求的最優值為 例如,當 a1,a2 a3 a4 a5 a6 2,11,4,13,5,2 時,最大子段和為 11 4 13 20 1 最大子段和問題的簡單演算...

動態規劃之最大子段和問題

有一由n個整數組成的序列a 求該序列如 a i a i 1 a j 的子段和的最大值。如果序列中全部是負數則最大子段和為0,依此定義,所求的最優值max,1 i j n。輸入 n 序列的長度 序列值輸出 最大子段和 例如 輸入 6 2,11,4,13,5,2 輸出 20演算法可通過動態規劃求解 我們...

動態規劃之最大子段和問題

問題描述 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。當所有整數均為負值時定義其最大子段和為0。依此定義,所求的最優值為 例如,當 a1,a2 a3 a4 a5 a6 2,11,4,13,5,2 時,最大子段和為 11 4 13 20 1 最大子段和問題的簡單演算...