在被noi题库中一道叫山区建小学[openjudge7624]的一道题虐无数次后见到了这道IOI的原题,不禁感慨我现在回到2000年兴许能进队呢= =|||
好,首先这道题一眼就知道是一个添加号类型DP。
所以我们自然而然的想到了下面的方程:
f[i][j] = min(f[k][j - 1] + dis[k + 1][i], f[i][j]);
- 在这里,f[i][j]表示前i个城镇建j个邮局的最优解,k为断点位置
那么dis数组怎么求呢,我们有如下方程:
dis[i][j] = dis[i][j - 1] + a[j] - a[(i + j) / 2];
- 在这里,dis[i][j]表示城镇i到j建立一个邮局的最优解,a为各个城镇坐标
那么解释一下为什么dis[i][j]可以由dis[i][j-1]求出:
1. 首先由贪心策略得,在一些城镇建立一个邮局只要选取最中间的那一个即为最优解,具体证明。
2. 那么为什么可以由前一个状态推过来,首先我们考虑i到j-1的城镇中我们把邮局安放到了k这个位置,对于一个新加入的城镇j,我们会把位置从k挪到k+1,设 X = a[k+1] - a[k],那