郵局問題 DP

2021-07-22 12:51:00 字數 1255 閱讀 8719

【問題描述】

一些村莊建在一條筆直的高速公路邊上,我們用一條座標軸來描述這條公路,每個村莊的座標都是整數,沒有兩個村莊的座標相同。兩個村莊的距離定義為座標之差的絕對值。我們需要在某些村莊建立郵局。使每個村莊使用與它距離最近的郵局,建立郵局的原則是:所有村莊到各自使用的郵局的距離總和最小。

【輸入格式】

第一行:n m ,表示有n個村莊,建立m個郵局。

第二行:a1 a2 a3 .. an 表示n個村莊的座標。

【輸出格式】

第一行:表示最小距離總和。

【輸入樣例】

10 5

1 2 3 6 7 9 11 22 44 50

【輸出樣例】

【資料範圍】

1<=村莊數<=300, 1<=郵局數<=30,

1<=村莊座標<=10000

需要分組的dp,將每乙個郵局所對應的村莊都可以看作為一組,這樣就可以設狀態函式f(i,j)為前j個村莊建立i個郵局距離總和最小,然後寫出狀態轉移方程f(i,j)=min(f(i-1,k-1)+g[k][j]) (i<=k<=j)g[i][j]意為i到j中每個村莊的距離總和最短距離,可以用中位數計算。邊界為f(i,i)=0。

#include

#include

#include

using

namespace

std;

const

int maxn = 302, inf = 500000000;

int n,m,a[maxn],d[maxn][maxn],g[maxn][maxn];

//f(i,j)前j個村莊建立i個郵局距離總和最小

//f(i,j)=min(f(i-1,k-1)+g[k][j]) i<=k<=j

//g[i][j]i到j中每個村莊的距離總和最短

int calc(int i,int j)

return min(ans1,ans2);

}int main()

for(int i=1;i<=n;i++)

for(int j=i;j<=n;j++)

memset(d,10,sizeof(d));

for(int i=0;i<=n;i++)

for(int i=1;i<=m;i++)

for(int j=i;j<=n;j++)

d[i][j]=t;

}printf("%d",d[m][n]);

return

0;}

郵局 dp經典問題

題目 題意 一些村莊被建立在一條筆直的高速公路邊上,我們用一條座標軸來描述這條高速公路,每乙個村莊的座標都是整數,沒 有兩個村莊座標相同。兩個村莊間的距離,定義為它們的座標值差的絕對值。我們需要在一些村莊建立郵局 當然,並不是每 乙個村莊都必須建立郵局,郵局必須被建立在村莊裡,因此它的座標和它所在的...

uva 662 經典DP郵局問題)

題意 給在一條直線上的n個漢堡店,以及每個漢堡店在x軸上的座標。求建m個 產,使得每個漢堡店到m個 產的距離和最小。解析 經典的郵局dp問題。首先需要知道到達幾個村莊的最小距離和是這幾個村莊的座標中點。先用乙個遍歷找出所有i j之間的所有最小距離,然後再dp。狀態轉移方程 dp i j min dp...

郵局選址問題

在乙個按照東西和南北方向劃分成規整街區的城市裡,n個居民點散亂地分布在不同的街區中。用 x 座標表示東西向,用 y座標表示南北向。各居民點的位置可以由座標 x,y 表示。街區中任意2 點 x1,y1 和 x2,y2 之間的距離可以用數值 x1 x2 y1 y2 度量。居民們希望在城市中選擇建立郵局的...