邮箱问题【一类最短距离问题续】
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
相比前一个距离题,邮箱问题变成了多阶段的最小距离问题,思想是类似的,任意两个村庄间设置邮箱的时,一定是取中间点的位置。转换方程可以为:
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]; }
相关文章推荐
- 一类最短距离问题
- HDU 3790 最短路径问题(Dijkstra,要求距离和时间都最短)
- 最大最短距离问题
- NYOJ 7-街区最短路径问题(曼哈顿距离)
- soj1209- 最短的距离(精度问题)
- 最短路径问题平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。
- nyoj 7街区最短路径问题(暴力 || 哈曼顿距离)
- 街区最短路径问题--所谓的曼哈顿距离,不是很懂
- 最短编辑距离问题 : Levenshtein Distance
- hdu 3790 最短路径问题(距离和费用)
- NYOJ 7-街区最短路径问题(曼哈顿距离)
- 问题七十六: 两数组最短距离。
- 曼哈顿距离--NYOJ7街区最短路径问题
- POJ-3356 AGTC (最短编辑距离问题)
- c/c++常用算法(15) -- 经典数据结构(城市之间的最短距离问题)
- NYOJ - 7 - 街区最短路径问题 ( 曼哈顿距离 )
- [经典面试题][腾讯]选择原料工厂(最短距离问题)
- 问题 A: 两数组最短距离
- 求点之间的最短距离问题
- POJ-3356 AGTC (最短编辑距离问题)