題目簡述:從左到右依次有$n \leq 10^7$個Domino骨牌,高度為$h_i$,手動推倒他的花費為$c_i$。每個骨牌之間的距離為$1$。一個骨牌可以被向左或者向右推倒。當第$i$個骨牌被推倒時,他會以相同方向推倒與其距離$<h_i$的所有骨牌。求推倒所有骨牌的最小花費。
解:code
令$L[i], R[i]$分別表示第$i$個骨牌向左(右)推倒后,會將$(L[i], i]$($[i, R[i])$)區間內的骨牌推倒。這個可以用單調棧在$O(n)$時間內解決。
令$f[i]$表示(只通過推倒前$i$個骨牌來)推倒前$i$個骨牌的最小花費,則對$1 \leq i \leq n$,
$$ f[i] = \min\left\{ f[L[i]]+c_i, \min_{j < i < R[j]} \{f[j-1]+c_j\} \right\}, $$
這個動態規劃也能用單調棧在$O(n)$時間內解決。