【問題描述】
一些村莊建在一條筆直的高速公路邊上,我們用一條座標軸來描述這條公路,每個村莊的座標都是整數,沒有兩個村莊的座標相同。兩個村莊的距離定義為座標之差的絕對值。我們需要在某些村莊建立郵局。使每個村莊使用與它距離最近的郵局,建立郵局的原則是:所有村莊到各自使用的郵局的距離總和最小。
【輸入格式】
第一行: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 度量。居民們希望在城市中選擇建立郵局的...