日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【DP】【四边形不等式】邮局(P4767)

發(fā)布時(shí)間:2023/12/3 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【DP】【四边形不等式】邮局(P4767) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題

P4767


題目大意

給出坐標(biāo)軸上的n個(gè)點(diǎn),讓你選擇m個(gè)點(diǎn)作為特殊點(diǎn),使所有點(diǎn)到最近特殊點(diǎn)的距離之和最小


解題思路

考慮對于一個(gè)區(qū)間選擇一個(gè)特殊點(diǎn)的最小代價(jià),可以把所有點(diǎn)到當(dāng)前點(diǎn)的路徑分割開來,即每段距離走的次數(shù)為1,2,3…l-1,l,r,r-1…3,2,1,其中連接l,r的就是選擇的特殊點(diǎn),顯然讓l,r相同代價(jià)最小,那么取中間點(diǎn)即可

在構(gòu)造時(shí)可以看作是構(gòu)造等腰三角形(高度為走的次數(shù)),那么每次往mid-r中加一次即可

然后考慮DP

設(shè) fi,jf_{i,j}fi,j? 為前 i 個(gè)點(diǎn)中選擇 j 個(gè)特殊點(diǎn)的最小貢獻(xiàn),那么沒到一個(gè)狀態(tài)考慮從哪個(gè)點(diǎn)開始重新構(gòu)建一個(gè)新區(qū)間(這個(gè)區(qū)間的最短距離都是到新的一個(gè)特殊點(diǎn)),那么時(shí)間復(fù)雜度 O(n2m)O(n^2m)O(n2m)

考慮用四邊形不等式優(yōu)化(筆者寫的不好,若看不懂可以到洛谷看題解qaq)

設(shè) dis 為區(qū)間最小代價(jià),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??

綜上,該轉(zhuǎn)移滿足四邊形不等式

然后可以用二維的決策單調(diào)性優(yōu)化轉(zhuǎn)移

時(shí)間復(fù)雜度 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; }

總結(jié)

以上是生活随笔為你收集整理的【DP】【四边形不等式】邮局(P4767)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。