首先写出朴素的式子:fi=min1≤j<i(cost−sumjdisj−(sumi−sumj)disi)。
其中 fi 表示第二个锯木厂建在 i 处的最小代价,sumi=i∑j=1wj,disi=n∑j=idj,cost 表示只有山脚的锯木厂的代价。
这貌似不是个 DP?不过也可以用斜率优化解决!
对于 1≤k<j<i,假设选 j 优于选 k,即 cost−sumjdisj−(sumi−sumj)disi≤cost−sumkdisk−(sumi−sumk)disisumjdisj+(sumi−sumj)disi≥sumkdisk+(sumi−sumk)disisumjdisj+sumidisi−sumjdisi≥sumkdisk+sumidisi−sumkdisisumjdisj−sumjdisi≥sumkdisk−sumkdisisumjdisj−sumkdisk≥(sumj−sumk)disisumjdisj−sumkdisksumj−sumk≥disi
按照套路,单调队列维护上凸包即可。
代码:
1 |
|