/**
* 电梯问题,要求路程长度最短。
* 类似加油站选址。
*
* f(i, k) = min{f(j, k-1) + g(j+1, i)}, k-1<=j<i
*
* 先求出g,中位数原理。
*
* 如果每层人数不定,则是带权中位数原理。
*
*
*/
public class Elevator {
public static int find(int[] a, int stops){
assert(true);
int n = a.length;
int[][] g = new int[n][n];
//任意两点之间,中位数求最短值。
for(int i=0; i<n; i++){
for(int j=i; j<n; j++){
int mid = (i+j)/2;
for(int k=i; k<=j; k++){
g[i][j] += (a[mid]-a[k])>0 ? (a[mid]-a[k]) : (a[k]-a[mid]);
}
}
}
Tools.printArray(g);
//初始化j=1那一列,表示前i个数选一个,最短值。
int[][] f = new int[n+1][stops+1];
for(int i=1; i<=n; i++){
f[i][1] = g[0][i-1];
}
//第i行第j列,取决于前i-1行的第j-1列
for(int i=1; i<=n; i++){
for(int j=2; (j<=stops)&&(j<=i); j++){
int min = -1;
for(int k=i-1; k>=j-1; k--){
int x = f[k][j-1] + g[k][i-1];
if(min==-1 || x<min){
min = x;
}
}
f[i][j] = min;
}
}
System.out.println();
Tools.printArray(f);
return f[n][stops];
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = {1,2,3,4,5};
int x = Elevator.find(a, 3);
System.out.println(x);
}
}
电梯问题
最新推荐文章于 2022-04-27 09:16:00 发布