流水线调度问题

两条流水线

这是最开始学到的,两条流水线问题,然后有具体的一条线路的第i个站移动到另一天线路的第i + 1个站需要的时间,较为简单,简要介绍一下思路:

对于到达某条线路上的某个站时,已花费的最短时间dp[i],可以是同一条线路的i - 1站直接过来(没有换线路)也可以是从另一条线路的i - 1站转换过来,取其中较小的即可

可以列出下面的转移方程:

dp_first[i] = min(dp_first[i - 1] + line_first[i],dp_second[i - 1] + line_first[i] + second_to_first[i - 1]);
dp_second[i] = min(dp_second[i - 1] + line_second[i],dp_first[i - 1] + line_second[i] + first_to_second[i - 1]);

最后再两个dp数组的最后一个元素进行比较,得到较小值则是答案

n条流水线

题目

每一个手办都是有灵魂的,下面这个高达手办,帅到爆炸有木有O-o(自己脑补)。然而要制作这样一件神器却要费不少功夫。假设现在某厂商引进了制作的整套流水车间,决定量产拯救世界。此车间有n条流水线,每条流水线线有m个装配站,编号都为1-m,每条工作线的第i个装配站都执行相同的功能。拼装一个手办要经过m个装配站才能加工完成,经过第i条工作线的第j个装配站要花费 p[i][j] 的时间,从第i个工作线移动到第j个工作线要花费t[i][j] 的时间,请问制造一个高达最少时间是多少?

输入

多组测试数据

对于每一组测试数据,第一行两个整数输入 N,M(100>=N,M>0),分别代表N条工作线和每条线有M个装配站。

接下来N行每行M个数( N*M 的矩阵,第i行第j个数代表描述中的p[i][j] ),0<权值<=100。

接下来N行每行N个数( N*N的矩阵,第i行第j个数代表描述中的t[i][j] ),0<权值<=100。

输出

对于每组数据,输出一行,需要的最少时间

分析

  1. 可以看到,在n条流水线的问题中,转移时间是以线路为标准,而不是以站点为标准了。
  2. 事实上,这就是两条流水线的推广形式,并且有了一定的简化,如果转移时间还是以站点为标准那将十分复杂。
  3. 考虑第k条线第i个站时,第i - 1站可以在第k条线上,也可以在其他线上

根据上面思路可以写出如下代码

for(station = 2;station <= m;station++){
            for(endLine = 1;endLine <= n;endLine++){
                for(startLine = 1;startLine <= n;startLine++){
                    result[endLine][station] = min(result[endLine][station],result[startLine][station - 1] + p[endLine][station] + t[startLine][endLine]);
                }
            }
        }

注意初始化

  1. result(其实就是dp)[i][1] = p[i][1](i : 1 ➡ n),很明显,每条线的第一站花费的最小时间只能是在这一站花费的时间
  2. result数组的其他元素全部初始化为inf
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值