希望有更好的解法
题目描述
N个产品每个产品有M个零件,Aij表示生产该零件的生产时间
需满足以下2个条件
- Aij需要生产出来必须保证Ai-1 j先生产出来
- Aij需要生产出来必须保证Ai j-1先生产出来
输入描述:
第一行输入两个数,用空格隔开,第一个代表N:N个产品;第二个代表M:每个产品M个零件
第二行之后,Aij表示生产该零件的生产时间
i行:每一行代表第i个产品
j列:每一列代表第i个产品的第j个零件
输出描述:
输出所有产品的生产时间
示例:
输入:
1 3
3.0
2.0
1.0
输出:6.000000
输入:
3 1
3.0 2.0 1.0
输出6.000000
输入:
2 4
10.000000 5.000000
4.500000 3.000000
4.499999 2.000000
2.000000 1.000000
输出:21.999999
分析
分析 21.999999 是个什么玩意
最后一个输入输出,输入的和是31.99999,但输出是21.99999,因此可以判定,在流水线上,零件生产是应接不暇的,存在多条生产线
当零件满足条件时就开始生产了
假设多条生产线,有一条前置生产线,这条生产线完成,之后的零件才可以完成,这条生产线未完成,之后的零件生成需要等待
前置条件先完成,不用等待
前置条件后完成,需要等待
最终得出规律,算出生产最后一个零件的前置零件,最长的用时,加上这个零件的生产用时
将此题目引申到矩阵,就是递归得出前置项的加和最大值
Python解法( 不用numpy )
class Time:
def __init__(self,time,Maxtime):
self.time = time
self.maxtime = Maxtime + time
lst = list(map(int,input().split()))
N = lst[0] # 代表列
M = lst[1] # 代表行
lst = []
for i in range(M):
lst.append(list(map(float,input().split())))
print(lst)
# 模拟一个小矩阵
'''
lst[0][0] = Time(lst[0][0],0)
print(type(lst[0][0]),lst[0][0].time,lst[0][0].maxtime)
lst[0][1] = Time(lst[0][1],lst[0][0].maxtime)
print(lst[0][1].time,lst[0][1].maxtime)
lst[1][0] = Time(lst[1][0],lst[0][0].maxtime)
print(lst[1][0].time,lst[1][0].maxtime)
lst[1][1] = Time(lst[1][1],lst[0][1].maxtime if lst[0][1].maxtime >= lst[1][0].maxtime else lst[1][0].maxtime)
print(lst[1][1].maxtime)
'''
# y出一个大矩阵
for i in range(M):
for j in range(N):
if i == 0 and j == 0:
lst[0][0] = Time(lst[0][0],0)
elif i == 0:
lst[0][j] = Time(lst[0][j],lst[0][j-1].maxtime)
elif j == 0:
lst[i][0] = Time(lst[i][0],lst[i-1][0].maxtime)
else:
lst[i][j] = Time(lst[i][j],lst[i-1][j].maxtime if lst[i-1][j].maxtime >= lst[i][j-1].maxtime else lst[i][j-1].maxtime)
print(lst[M-1][N-1].maxtime)