【DP】【四边形不等式】邮局(P4767)
正題
P4767
題目大意
給出坐標軸上的n個點,讓你選擇m個點作為特殊點,使所有點到最近特殊點的距離之和最小
解題思路
考慮對于一個區間選擇一個特殊點的最小代價,可以把所有點到當前點的路徑分割開來,即每段距離走的次數為1,2,3…l-1,l,r,r-1…3,2,1,其中連接l,r的就是選擇的特殊點,顯然讓l,r相同代價最小,那么取中間點即可
在構造時可以看作是構造等腰三角形(高度為走的次數),那么每次往mid-r中加一次即可
然后考慮DP
設 fi,jf_{i,j}fi,j? 為前 i 個點中選擇 j 個特殊點的最小貢獻,那么沒到一個狀態考慮從哪個點開始重新構建一個新區間(這個區間的最短距離都是到新的一個特殊點),那么時間復雜度 O(n2m)O(n^2m)O(n2m)
考慮用四邊形不等式優化(筆者寫的不好,若看不懂可以到洛谷看題解qaq)
設 dis 為區間最小代價,sum 為路徑長度
令 mid=b+a+12mid=\frac{b+a+1}{2}mid=2b+a+1?
若 2∣(b?(a+1))2|(b-(a+1))2∣(b?(a+1))
disa,b+disa+1,b+1=disa,b+disa+1,b+1=suma,mid+disa+1,b+disa+1,b+summid,b+1=disa+1,b+suma,b+1+disa+1,b=disa,b+1+disa+1,b\begin{aligned}dis_{a,b}+dis_{a+1,b+1}&=dis_{a,b}+dis_{a+1,b+1}\\ &=sum_{a,mid}+dis_{a+1,b}+dis_{a+1,b}+sum_{mid,b+1}\\ &=dis_{a+1,b}+sum_{a,b+1}+dis_{a+1,b}\\ &=dis_{a,b+1}+dis_{a+1,b}\end{aligned}disa,b?+disa+1,b+1??=disa,b?+disa+1,b+1?=suma,mid?+disa+1,b?+disa+1,b?+summid,b+1?=disa+1,b?+suma,b+1?+disa+1,b?=disa,b+1?+disa+1,b??
若 2?(b?(a+1))2\nmid(b-(a+1))2?(b?(a+1))
disa,b+disa+1,b+1=disa,b+disa+1,b+1=suma,mid+disa+1,b+disa+1,b+summid+1,b+1≥disa+1,b+suma,b+1+disa+1,b=disa,b+1+disa+1,b\begin{aligned}dis_{a,b}+dis_{a+1,b+1}&=dis_{a,b}+dis_{a+1,b+1}\\ &=sum_{a,mid}+dis_{a+1,b}+dis_{a+1,b}+sum_{mid+1,b+1}\\ &\geq dis_{a+1,b}+sum_{a,b+1}+dis_{a+1,b}\\ &=dis_{a,b+1}+dis_{a+1,b}\end{aligned}disa,b?+disa+1,b+1??=disa,b?+disa+1,b+1?=suma,mid?+disa+1,b?+disa+1,b?+summid+1,b+1?≥disa+1,b?+suma,b+1?+disa+1,b?=disa,b+1?+disa+1,b??
綜上,該轉移滿足四邊形不等式
然后可以用二維的決策單調性優化轉移
時間復雜度 O(nm)O(nm)O(nm)
code
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 3010 using namespace std; int n,m,a[N],f[N][N],d[N][N],dis[N][N]; int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;++i)scanf("%d",&a[i]);for(int i=1;i<=n;++i){dis[i][i]=0;for(int j=i+1;j<=n;++j)dis[i][j]=dis[i][j-1]+a[j]-a[i+j>>1];}memset(f,127/3,sizeof(f));f[0][0]=0;for(int j=1;j<=m;++j){d[n+1][j]=n;for(int i=n;i>0;--i)for(int k=d[i][j-1];k<=d[i+1][j];++k)if(f[k][j-1]+dis[k+1][i]<f[i][j])f[i][j]=f[k][j-1]+dis[k+1][i],d[i][j]=k;}printf("%d",f[n][m]);return 0; }總結
以上是生活随笔為你收集整理的【DP】【四边形不等式】邮局(P4767)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么把电脑里的相片导入苹果手机电脑照片如
- 下一篇: 【最小生成树】水箱(P5952)