题目
思路
看书做的这道题。
首先可以想到最优解的配对方案定是选择相邻的两个点配对。(二分图匹配?)
记$i$号点与$i-1$号点的距离为$d[i]$ ,题目就是要求这$n-1$个数中选$k$个数且选择的数不相邻,所有数总和的最小值。(DP??)
正解当然就是我们最方便的堆!!!
先看K=1时:答案就是d数组的最小值。
当K=2时: 设$d_{min}$ 的下标为$x$ 。
答案就是$d[x]$ + 除去$d[x-1],d[x],d[x+1]$剩下数的最小值,
或$d[x-1]+d[x+1]$。
用书上的证明:
如果$d[x-1]$和$d[x+1]$都没选,那么不选$d[x]$一定不优;如果在$d[x-1]$和$d[x+1]$中选了一个,那把那个换成$d[x]$一定更优,所以最优解就一定在这两个之中。
以上和堆没有关系啊
可以得到推论:最小值两边的数要么都选要么都不选。
因此我们可以先选最小值$d[x]$,再删除$d[x-1],d[x],d[x+1]$,再插入$d[x-1]+d[x+1]-d[x]$(一个“反悔”操作)
整体上就删去了一个数,问题变为了$n-1$个数中选$k-1$个数的子问题了。
这样一直做$k$次就好了。
有一个细节就是$d[0]$和$d[n]$要为一个极大值,保证不受两端的影响。
再之后用链表和堆来维护就好了。
代码
1 |
|