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

    技术2022-05-20  31

    上题不禁让人想起了一个著名的邮箱问题:有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]; }

     


    最新回复(0)