两条流水线
这是最开始学到的,两条流水线问题,然后有具体的一条线路的第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。
输出
对于每组数据,输出一行,需要的最少时间
分析
- 可以看到,在n条流水线的问题中,转移时间是以线路为标准,而不是以站点为标准了。
- 事实上,这就是两条流水线的推广形式,并且有了一定的简化,如果转移时间还是以站点为标准那将十分复杂。
- 考虑第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]);
}
}
}
注意初始化
- result(其实就是dp)[i][1] = p[i][1](i : 1 ➡ n),很明显,每条线的第一站花费的最小时间只能是在这一站花费的时间
- result数组的其他元素全部初始化为inf