Allowable Length#
def find_stacks(rows: List[List[Piece]]) -> List[List[Piece]]:
"""
Finds the stacks of the pieces.
rows: List of row of pieces ordered from top to bottom.
return: List of stacks of pieces ordered from top to bottom.
"""
stacks = []
for row in rows:
for piece in row:
added = False
for stack in stacks:
subpiece = stack[-1]
if subpiece is subset piece:
stack.append(piece)
added = True
if added == False:
new_stack = [piece]
stacks.append(new_stack)
return stacks
len(1,1) |
len(1,2) |
len(1,3) |
len(1,4) |
… |
len(1,n-1) |
len(1,n) |
len(2,2) |
len(2,3) |
len(2,4) |
… |
len(2,n-1) |
len(2,n) |
|
len(3,3) |
len(3,4) |
… |
len(3,n-1) |
len(3,n) |
||
len(4,4) |
… |
len(4,n-1) |
len(4,n) |
|||
… |
… |
… |
… |
… |
… |
… |
… |
len(n-1,n-1) |
len(n-1,n) |
||||
… |
_ |
len(n,n) |
\[\begin{split}\begin{align}
& \text{len}(1,1) = \max\{L_d, L_1 + d\} = \max\{1.4, 1 + 0.3\} = 1.4 \\
& \text{len}(1,2) = 2 \times \max\{L_d, L_2 + d\} = \max\{1.4, 1.5 + 0.3\} = 2 \times 1.8 \\
& \text{len}(1,3) = 3 \times \max\{L_d, L_3 + d\} = \max\{1.4, 2 + 0.3\} = 3 \times 2.3 = 6.9 \\
& \text{len}(2,2) = \text{len}(1,1) + \max\{L_1+L_d , L_2 + d\} \\
& \quad = 1.4 + \max\{1+1.4, 1.5+0.3\} = 1.4 + 2.4 \\
& \text{len}(2,3) = \min\{\text{len}(1,1) + 2 \times \max\{L_1+L_d, L_3+d\} , \text{len}(1,2) + \max\{L_2+L_d, L_3+d\}\} \\
& \quad = \min\{1.4 + 2 \times \max\{1+1.4, 2+0.3\} ,2 \times 1.8 + \max\{1.5+1.4,2+0.3\}\} \\
& \quad = \min\{1.4 + 2 \times 2.4 ,2 \times 1.8 + 2.9\} = 6.2 \\
& \text{len}(3,3) = \text{len}(2,2)+\max\{L_2+L_d,L_3+d\} \\
& \quad = 1.4 + 2.4 + \max\{1.5+1.4, 2+0.3\} = 1.4 + 2.4 + 2.9 = 6.7
\end{align}\end{split}\]
(\(1.4, \varnothing\)) |
(\(3.6, \varnothing\)) |
(\(6.9, \varnothing\)) |
(\(3.8, 1\)) |
(\(6.2, 1\)) |
|
(\(6.7, 2\)) |