您的位置:首页 > 其它

邮箱问题【一类最短距离问题续】

2011-03-02 13:17 155 查看
上题不禁让人想起了一个著名的邮箱问题:有n个村庄沿着一条公路依次排开,相邻村庄间距是随意的,邮局打算沿公路设置m个邮箱,邮局希望你来设计一个让村民寄信或取信走的距离最省的邮箱布局方案。

相比前一个距离题,邮箱问题变成了多阶段的最小距离问题,思想是类似的,任意两个村庄间设置邮箱的时,一定是取中间点的位置。转换方程可以为:

f(p,v) = min{f(p-1, v), f(p-1, vi)+cost(vi+1,v)} p指邮箱,v指村庄,vi取(0,v-1),cost记录任意两个村庄间设置邮箱的最优解

f(0,v) = MAX

f(p,0) = 0

protected int MAX = 1<<24;
public int calcPostOffice(int[] villages, int numPostOffice)
{
Arrays.sort(villages);

int[][] cost = new int[villages.length+1][villages.length+1];
for(int i=1; i<=villages.length; i++)
for(int j=i+1; j<=villages.length; j++)
{
int m = (i+j)/2;
for(int k=i; k<=j; k++)
cost[i][j] += Math.abs(villages[k-1]-villages[m-1]);
}
int[][] dp = new int[numPostOffice+1][villages.length+1];
for(int i=0; i<dp.length; i++)
{
Arrays.fill(dp[i], MAX);
dp[i][0] = 0;
}
for(int i=1; i<dp.length; i++)
for(int j=1; j<dp[0].length; j++)
{
int min = dp[i-1][j];
for(int k=0; k<j; k++)
min = Math.min(min, dp[i-1][k]+cost[k+1][j]);
dp[i][j] = min;
}
return dp[numPostOffice][villages.length];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: