【原创】编程之美---小飞的电梯调度问题 (停k层的解法)
2010-10-12 15:33
274 查看
问题.有一栋楼,一共有N层,要去每一层的人分别是A[1],A[2]....A
,如果电梯可以停K次,问停在哪K层让所有人走的矩离最短?
[备注:这只是我的个人解法,欢迎和我讨论]
解法:
用一个数组opt[i][j]记录电梯前i次停在1到j层之间,所有人走的路的最短矩离。用cost[i][j]记录如果电梯从第i层到第j层只能停一次,电梯停在最佳位置让所有人走的矩离最短的最优解。那么cost[i][j]怎么求呢?(这里把这个解法省略,具体可参见编程之美“小飞的电梯调度”)。如果前i次停留在前j层,那么第i+1次停留在第j+1至j+k层(j+k<=n),则状态转移方程为
opt[i+1][j+k]=min{opt[i][j]+cost[j+1][j+k];} (k+j<=n)
Cost数组存放电梯从第i层到j层停一次的最小走动矩离,构造cost的代码如下:
for(i=1;i<=m;i++)
for(j=i;j<=m;j++)
{
cost[i][j] = 0;
mid = 求得电梯在i到j层的最佳停留位置;
for(k=i;k<=j;k++)
cost[i][j]+=(distance[mid]-distance[k])>=0 ?
distance[mid]-distance[k]:distance[k]-distance[mid];
}
Opt[i][j] 表示从电梯在第1层到第j层停i次所有人的最小走动矩离,对于i=1(即电梯只停一次的情况)来说,opt[i][j] = cost[i][j],如果让电梯在1 至 j层停两次,也就是i=2的情况,可能是下面一种情况的最优解:
第一次停在第一层,第二次停在2至j层;
第一次停在1至2层,第二次停在3至j层;
第一次停在1至3层,第二次停在4至j层;
等等。。。。。
该部分的代码如下:
for(i=0;i<=n;i++)
for(j=0;j<=m;j++)
if(opt[i][j]<Integer.max)
{
for(k=1;j+k<=m;k++)
{
if(opt[i+1][j+k]>opt[i][j]+cost[j+1][j+k])
{
opt[i+1][j+k] = opt[i][j]+cost[j+1][j+k];
}
}
}
转自:http://blog.163.com/guixl_001/blog/static/41764104201082062317857/
,如果电梯可以停K次,问停在哪K层让所有人走的矩离最短?
[备注:这只是我的个人解法,欢迎和我讨论]
解法:
用一个数组opt[i][j]记录电梯前i次停在1到j层之间,所有人走的路的最短矩离。用cost[i][j]记录如果电梯从第i层到第j层只能停一次,电梯停在最佳位置让所有人走的矩离最短的最优解。那么cost[i][j]怎么求呢?(这里把这个解法省略,具体可参见编程之美“小飞的电梯调度”)。如果前i次停留在前j层,那么第i+1次停留在第j+1至j+k层(j+k<=n),则状态转移方程为
opt[i+1][j+k]=min{opt[i][j]+cost[j+1][j+k];} (k+j<=n)
Cost数组存放电梯从第i层到j层停一次的最小走动矩离,构造cost的代码如下:
for(i=1;i<=m;i++)
for(j=i;j<=m;j++)
{
cost[i][j] = 0;
mid = 求得电梯在i到j层的最佳停留位置;
for(k=i;k<=j;k++)
cost[i][j]+=(distance[mid]-distance[k])>=0 ?
distance[mid]-distance[k]:distance[k]-distance[mid];
}
Opt[i][j] 表示从电梯在第1层到第j层停i次所有人的最小走动矩离,对于i=1(即电梯只停一次的情况)来说,opt[i][j] = cost[i][j],如果让电梯在1 至 j层停两次,也就是i=2的情况,可能是下面一种情况的最优解:
第一次停在第一层,第二次停在2至j层;
第一次停在1至2层,第二次停在3至j层;
第一次停在1至3层,第二次停在4至j层;
等等。。。。。
该部分的代码如下:
for(i=0;i<=n;i++)
for(j=0;j<=m;j++)
if(opt[i][j]<Integer.max)
{
for(k=1;j+k<=m;k++)
{
if(opt[i+1][j+k]>opt[i][j]+cost[j+1][j+k])
{
opt[i+1][j+k] = opt[i][j]+cost[j+1][j+k];
}
}
}
转自:http://blog.163.com/guixl_001/blog/static/41764104201082062317857/
相关文章推荐
- 编程之美---小飞的电梯调度问题 (停k层的解法) (正在怀疑该解法的正确性)
- 编程之美--1.8--小飞的电梯调度问题--扩展问题--2--(M层电梯选择K层停靠)
- 编程之美---小飞的电梯调度问题 1.8 扩展2
- 编程之美--游戏之乐--1.8小飞的电梯调度问题
- 第一次结队编程(电梯调度问题)
- 编程之美-小飞的电梯调度算法另一种解
- 编程之美1.8小飞的电梯调度算法扩展问题
- 《编程之美——微软技术面试心得》的C#实现---电梯调度问题解法一
- 重新开始战斗06-编程之美-电梯调度问题
- 电梯调度编程
- 趣味算法题——电梯调度问题
- 电梯调度程序结对编程
- 电梯调度程序结对编程
- 【编程素质】算法-独立任务最优调度问题(双机调度问题)
- 石家庄铁道大学基础教学楼电梯调度问题
- 体验结对开发的乐趣(6)--(电梯调度问题)
- 结队编程电梯调度
- 结队编程作业——电梯调度
- 【原创】高性能网络编程(二):上一个10年,著名的C10K并发连接问题
- 编程之美3.7队列中取最大值操作问题(新解法,空间复杂度比原解法低)