我不想打表,所以我证明了这道题的四边形不等式。

$w_{a,d}$表示区间$[a,d]$建一个邮局的最小代价,也就是选择中位数。

首先证明$a\le b\le c \le d,w_{a,d}\ge w_{b,c}$

这个不难,若$a<b\le c<d$,这是成立的,因为在中位数左边,右边均多了数,也就是代价增加了。

若$a=b\le c\le d$,$w_{a,d},w_{a,c}$,若中位数发生改变,那么也就是$mid$向右发生偏移,那么在左边的个数多了一个,而右边个数至少也是原来的,总的代价多了一个偏移量,因此$w_{a,d}\ge w_{a,c}$

中位数向左发生偏移是类似的。

因此$a\le b\le c \le d,w_{a,d}\ge w_{b,c}$。

下面$a\le b\le c\le d,w_{a,d}+w_{b,c}\ge w_{a,c}+w_{b,d}$,接下来,只证明$a<b,w_{a,b+1}+w_{a+1,b}\ge w_{a,b}+w_{a+1,b+1}$。

对于$w_{a,b+1},w_{a+1,b}$,它们的中位数是相等的,记中位数为$mid_1$。

那么有$w_{a,b+1}+w_{a+1,b}=2*w_{a+1,b}+d_{b+1}-d_{mid_1}+d_{mid_1}-d_{a}$

$\because w_{a,b}\le w_{a+1,b}+d_{mid_1}-d_a,w_{a+1,b+1}\le w_{a+1,b}+d_{b+1}-d_{mid_1}$

$w_{a,b+1}+w_{a+1,b}\ge w_{a,b}+w_{a+1,b+1}$

证毕。

之后就是一些常规操作了。

对于$a<c$,$w_{a,c+1}+w_{a+1,c}\ge w_{a,c}+w_{a+1,c+1}$

对于$a<c+1$,$w_{a+1,c+1}+w_{a+2,c}\ge w_{a+1,c}+w_{a+2,c+1}$

两式相加,有

$w_{a,c+1}+w_{a+1,c}+w_{a+1,c+1}+w_{a+2,c}\ge w_{a,c}+w_{a+1,c+1}+w_{a+1,c}+w_{a+2,c+1}$

减掉重的部分,有

$w_{a,c+1}+w_{a+2,c}\ge w_{a,c}+w_{a+2,c+1}$

以此类推,有

$a\le b\le c,w_{a,c+1}+w_{b,c}\ge w_{a,c}+w_{b,c+1}$

$a\le b\le c\le d,w_{a,d}+w_{b,c}\ge w_{a,c}+w_{b,d}$


之后就是推$f$也是一个四边不等式,证明

$\large f_{i,j+1}+f_{i+1,j}\ge f_{i,j}+f_{i+1,j+1}$。

先明确一下$f$的定义,$f_{i,j}$表示前$i$个村庄共有$j$个邮局的最小代价。

$DP$推推得:

$f_{i,j}=\min\{f_{k,j-1}+w_{k+1,i}\}$

证明$j=1$的情况。

$f_{i,2}+f_{i+1,1}\ge f_{i,1}+f_{i+1,2}$

$f_{i,2}+w_{1,i+1}\ge f_{i+1,2}+w_{1,i}$

设$f_{i,2}$的最优决策为$p(0<p<i)$,即$f_{i,2}=w_{1,p}+w_{p+1,i}$

还有$f_{i+1,2}$的最优决策可能不为$p$,即$f_{i+1,2}\le w_{1,p}+w_{p+1,i+1}$

四边形不等式,
$w_{1,i+1}+w_{p+1,i}\ge w_{1,i}+w_{p+1,i+1}$

有$w_{1,i+1}+w_{1,p}+w_{p+1,i}\ge w_{1,i}+w_{1,p}+w_{p+1,i+1}$

因此
$f_{i,2}+f_{i+1,1}=w_{1,i+1}+w_{1,p}+w_{p+1,i}\ge w_{1,i}+w_{1,p}+w_{p+1,i+1}\ge f_{i,1}+f_{i+1,2}$

之后数学归纳法即可,已经比打表法好多!。


之后证明一下决策单调性

简记$p_{i,j}$为令$f_{i,j}$取到最小值的$k$值,那么$p_{i,j-1}\le p_{i,j}\le p_{i+1,j}$

证明:

  • 记$p=p_{i,j}$,那么对于$\forall k\le p$,因为$f$满足四边形不等式,则有

$f_{p,j-1}+f_{k,j}\ge f_{k,j-1}+f_{p,j}$

$f_{k,j}-f_{p,j}\ge f_{k,j-1}-f_{p,j-1}$

  • 因为$p$的最优性,那么$f_{k,j-1}+w_{k+1,i}\ge f_{p,j-1}+w_{p+1,i}$
  • 因此$(f_{k,j}+w_{k+1,i})-(f_{p,j}+w_{p+1,i})=f_{k,j}+w_{k+1,i}-f_{p,j}-w_{p+1,i}\ge f_{k,j-1}-f_{p,j-1}+w_{k+1,i}-w_{p+1,i}\ge 0$

因此$f_{k,j}+w_{k+1,i}\ge f_{p,j}+w_{p+1,i}$

所以对于$f_{i,j}$来说,$p$优于任何的$k\le p$。因此$p_{i,j}\ge p_{i,j-1}$

同理,$p_{i,j}\le p_{i+1,j}$

证毕。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define gc getchar()
using namespace std;
const int P=305,N=3005;
inline void qr(int &x)
{
    x=0;char c=gc;int f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc;}
    while(c>='0'&&c<='9'){x=x*10+(c^48);c=gc;}
    x*=f;
}
void qw(int x)
{
    if(x<0)x=-x,putchar('-');
    if(x/10)qw(x/10);
    putchar(x%10+48);
}
int f[N][P],s[N],a[N],p[N][P];
inline int calc(int l,int r)
{
    int mid=l+r+1>>1;
    return a[mid]*(mid-l+1)-(s[mid]-s[l-1])+(s[r]-s[mid])-a[mid]*(r-mid);
}
int main()
{
    int n,m;qr(n),qr(m);
    for(int i=1;i<=n;i++)qr(a[i]),s[i]=s[i-1]+a[i];
    memset(f,0x3f,sizeof(f));
    for(int i=1;i<=n;i++)f[i][1]=calc(1,i);
    for(int i=1;i<=m;i++)p[n][i]=1;
    for(int j=2;j<=m;j++)
    {
        p[n+1][j]=n;int tmp=0x3f3f3f3f;
        for(int i=n;i>=1;i--)
            for(int k=p[i][j-1];k<=p[i+1][j];k++)
                if((tmp=f[k][j-1]+calc(k+1,i))<f[i][j])
                {
                    f[i][j]=tmp;
                    p[i][j]=k;
                }
    }
    qw(f[n][m]);puts("");
    return 0;
}