编程之美:小飞的电梯调度
解法1枚举:省略
解法2cost:i+1层: Y+N1+N2-N3
i层: Y
i-1层 : Y-N1+N2+N3
可知cost(i-1)>cost(i)的条件:N1<N2+N3,两边同时加N2得到,N1+N2<N2*2+N3 (1)
cost(i+1)<cost(i)的条件:N1+N2<N3(2)
cost(i+1) <cost(i-1)的条件:N1<N3即N1+N2<N2+N3(3)
初始条件下:N1=0,N2<N3,(1)(2)(3)都满足,cost(i-1)>cost(i)>cost(i+1)
之后随着电梯停留层数增加,N1增加,N3降低,(2)最先会被打破
于是,可用(2)作为判断条件。
解法3转:中位数
假设只有两个人,一个去9层,一个去2层,那么不管电梯停在2至9层中间的任何楼层,两个人的总花费都是7.就比如在数轴上点2和点9中间的任何点距离2和9的距离之后都是7。那么停在哪都无所谓了。假设有N个人,他们的目标楼层分别是2,3,3,4,5,5,5,7,7,8,9。对于两端的(2,9)电梯只要停在他们之间都一样。同理对于(3,8)电梯只要停在他们中间都一样……。最终电梯只要停在中间那个数即可。也就是中位数。如果N是偶数个的话,停在中间那两个数任何一个都可以的。
扩展题:
1.采用2的方法分析,可得还是(2)的条件首先被突破,判断条件变为:N3*k>(N1+N2。
2.转:用一个数组opt[i][j]记录电梯前i次停在1到j层之间,1-j层所有人走的路的最短矩离。用cost[t][j]记录如果电梯从第t层到第j层只能停一次,电梯停在最佳位置让所有在t到j层的人走的矩离最短的最优解。那么cost[t][j]怎么求呢?(这里把这个解法省略,具体可参见编程之美“小飞的电梯调度”)。
如果前i-1次停留在前t-1层,那么第i次停留在第t至j层(k<j),则状态转移方程为
opt[i][j]=min{opt[i-1][t-1]+cost[t][j]} (i<=t<=j)。先计算出cost[][],再动态规划计算出opt[0][]
for(int i=1;i<m;++i)
for(int j=i;j<n;++j)
{
opt[i][j]=Integer.max;
for(int t=i;t<=j;++t) if(opt[i-1][t-1]+cost[t][j]<opt[i][j]) opt[i][j]=opt[i-1][t-1]+cost[t][j];
}

浙公网安备 33010602011771号