题目大意
在一条直线上有n个村庄,选出m个村庄,在其中每个村庄建立一个邮局,要求每个村庄到最近邮局的距离和最小。
f[m,n]为问题的解
f[i,j]表示在前j个村庄建立i个邮局的最小代价
状态转移方程和边界条件f[1,j]=w[1,j]
m[i,j]=min(m[i-1,k]+w[k+1,j]) i<=j
其中w[i,j]表示在d[i..j]之间建立一个邮局的最小距离和,
可以证明,当仅建立一个邮局时,最优解出现在中间,
即设建立邮局的村庄为k,则k=(i+j)/2
证明函数w满足四边形不等式,即
w[i,j]+w[i’,j’]<=w[i’,j]+w[i,j’] , i<=i’<=j<=j’
算法降次优化 s[i-1,j]<=s[i,j]<=s[i,j+1]
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int f[35][305], dis[