斜率優化略解

2022-04-30 13:21:13 字數 1942 閱讀 2225

斜率優化演算法最重要的一步,就是要將狀態轉移方程改寫為y=kx+b的形式。而這一演算法主要的難點就在於,對於乙個複雜的狀態轉移方程,我們將哪些項將作為y,哪些項最為k和x,哪些項作為b。

我們以luogu p3195 [hnoi2008]玩具裝箱toy為例來說斜率優化

在本題中,設字首和為sum[i],由題意易得dp方程:

\[dp[i]=min(dp[j]+(sum[i]+i-sum[j]-j-l-1)^2) (j

這個方程明顯是\(o(n^2)\)的,過不了此題

令\(a[i]=sum[i]+i\),\(b[i]=sum[i]+i+l+1\)(這一步是為了簡化計算)

則(先忽略min):

$$dp[i]=dp[j]+(a[i]-b[j])^2$$

展開得:

$$dp[i]=dp[j]+a[i]2-2⋅a[i]⋅b[j]+b[j]2$$

移項得(移的項實際比較套路):

$$2⋅a[i]⋅b[j]+dp[i]−a[i]2=dp[j]+b[j]2$$

我們把這個方程轉化成y=kx+b的形式:

\(dp[j]+b[j]^2\)是y,\(2⋅a[i]\)是k(斜率),\(b[j]\)是x,\(dp[i]-a[i]^2\)是b(截距)

這個式子珂以變成平面直角座標系上的一條一次函式

因為對於每個i來說,a[i]都是確定的

所以dp[i]的含義珂以轉化為:當上述直線過點\(p(b[j],dp[j]+b[j]^2)\)時,直線在y軸的截距加上\(a[i]^2\)(乙個定值)

而題目即為找這個截距的最小值

本題中可能為最優的p點組成了乙個下凸包(其他題目可能不同,結合題目具體分析)

顯然,凸包中相鄰兩點斜率是單調遞增的

而目標直線的斜率\(2⋅a[i]\)也是單調遞增的

滿足條件的最優\(p_j\)一定為第乙個\(slope(p_j,p_) > 2 \cdot a[i]\)的點(slope(a,b)表示a,b兩點連線的斜率)

我們珂以考慮用單調佇列來維護\(slope(p_j,p_)\)

完整**:#include #define n 50005

#define db double

#define getchar nc

using namespace std;

inline char nc()

inline int read()

while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();

return x*f;

}inline void write(register long long x)

int n,l;

db sum[n],dp[n];

int head,tail,q[n];

inline db a(register int i)

inline db b(register int i)

inline db y(register int i)

inline db slope(register int i,register int j)

int main()

{ n=read(),l=read();

head=tail=1;

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

{sum[i]=(db)read();

sum[i]+=sum[i-1];

while(head一、相鄰兩個決策點的斜率不遞增

這種情況下,我們無法保證小於等於當前斜率的決策點j一定也小於下乙個狀態的斜率。因此不能進行「彈掉隊首元素」這一步。但是這不影響我們維護乙個下凸殼,因此我們可以在單調佇列(下凸殼)內進行二分查詢,找到第乙個使該決策點和下乙個決策點構成的線段斜率》k的決策點,即為當前最優決策。

二、每個決策點橫座標不遞增

這意味著要在凸殼任意位置動態插入頂點、動態查詢,我們珂以使用平衡樹來維護凸殼。

RPAD函式略解

在寫本篇部落格之前,有一點小東西要寫在前面,漢字佔多少個位元組得看你用的是什麼編碼集,如果是gbk和gb2312的話,確實是兩個位元組,在windows平台上會是你預期的兩個位元組。但是在linux平台使用的是utf8字符集,那麼就不一定了,不過,我現在做plsql等東西一般是在win平台上做的,l...

KMP演算法略解

前言 本文是我對kmp演算法的臨時理解,用於使我不懷疑kmp演算法的正確性,用著放心。如圖 1 長串與短串進行匹配暴力對齊匹配時,在紅叉號處失配,長串的子串藍串和短串的字首黃串相等。如圖 2 試圖利用已有資訊 黃串等於藍串 來快速尋找短串串頭下一次應該對齊長串的哪個位置,這個位置被描述為 下乙個可能...

Linux IP 命令略解

help 為該命令的幫助資訊。例項ip link show 顯示網路介面資訊 ip link set eth0 up 開啟網絡卡 ip link set eth0 down 關閉網絡卡 ip link set eth0 promisc on 開啟網絡卡的混合模式 ip link set eth0 p...