

题意
有p个邮局,n个村庄,邮局只能建在村庄里,
求令所有寄信距离之和最短的值。
题解
数据比较弱,O(n^3)过了。
dp[i][j]表示前i个村庄需要j个邮局,
其必为某个前k个村庄用j-1个邮局,k+1到i用1个邮局的最小值。
即可实现转移,对于某段区间建一个的最小值,邮局一定建在中位数即可。
如果有两个中位数,显然两个地点的值是相等的。
从左中位数a转移到右中位数b,sum-左一半点*dis(a,b)+右一半点*dis(a,b)=sum,没变
求dis(i,j)时用的前缀和,貌似还有一个O(n²)的转移做法。①
心得
感觉dp的下标略坑,总是搞不明白,
而且dp的预处理也不知道第一行处理为什么好。
据说有O(n²)的四边形优化,待补。②
k的内层循环据说也可以优化一下,不是0到i-1。③
一题耽误6-7hGG。
代码
#include
#include
#include
#include
#include
#include
#include