CF1131G

題意

\(n\)個骨牌呈行排列,高度爲\(h_i\),手動推倒的花費爲\(c_i\)。相鄰骨牌距離爲\(1\)。一個骨牌能夠被向左或者向右推倒。當第\(i\)個骨牌被推倒時,會以相同方向推倒與其距離\(<hi\)的全部骨牌,併產生連鎖反應。求推倒全部骨牌的最小花費。spa

作法

\(L_i,R_i\)爲將\(i\)向左/向右推倒,最遠被推倒的位置
\(f_i\)爲利用\([1,i]\)骨牌推倒前\(i\)張骨牌的最小花費class

\[f[i] = \min\left\{ f[L[i]]+c_i, \min_{j < i < R[j]} \{f[j-1]+c_j\} \right\}, \]

暴力作是\(O(n^2)\)
考慮求\(L_i\),若\(i\)向右推,能推倒\(x\),則必能推倒\(L_x\)
枚舉\(i=m\sim 1\),用單調棧維護能推倒\(i+1\)的位置。單調棧自棧頂至底,爲序列上從左向右的位置,顯然其\(L_i\)也是單調不增的(拱狀)im

\(R_i\)同理di

\(f_i\),單調棧內維護自頂至底,能推倒\(i-1\)的位置,從右往左,\(f_{x-1}+c_x\)單調不降的display

本站公眾號
   歡迎關注本站公眾號,獲取更多信息