[算法-动态规划]求可跳转情况下的最小路径
Description
简单来说,我们给定了一个XY大小的矩阵,每个entry上都是一些非负数,我们同时也给定了一组跃迁数,但是我们必须按顺序使用他们,当然也可以不用,我们想通过这些跃迁数找到到(X-1,Y-1)的最短路径
input
output
sample input and output
6 4
1 0 3 7 2 5
8 3 7 6 9 8
9 7 8 2 1 1
3 2 9 1 7 8
1 1
16
# fly right, fly right, jump right, jump up, fly right, fly up, for a total of 1+0+3+2+1+1+8=16
思路
我们使用动态规划的思想,首先我们到了一个点有四个选择,往右跳,往右走,往下走,往下跳。首先我们先从第一个jump开始,我们可以选择跳与不跳,这样就可以将所有不用跳的到(i,j)最短距离和一部分只用一次跳的距离更新(不一定是最优的,可能会在下个循环里中的往右走或往下走更新)
我们使用字典来实现,里面的key(i,j,s)表示到(i,j)并且利用s次跃迁的最小值。初始化的时候将输入的矩阵的左上角存入。并且使用exception来防止某些不可能出现的(i,j,s)
最后,我们对(X-1,Y-1,s)进行遍历,选取其中的最小值并且将它return
速度优化
当我们在某次更新(i,j)是没有用到jump时,那么按照规定,这之后的jump我们也没办法使用,所以这时候我们可以直接break,这样会缩短差不多2/3的时间
内存优化
对于不会出现的key选择不添加入字典(使用exception)
实现(使用字典)
if __name__ == '__main__':
width, height = map(int, input().split())
input_matrix = [[0 for i in range(width)]for j in range(height)]
for i in range(height):
input_matrix[i] = list(map(int, input().split()))
jumps = list(map(int, input().split()))
#jumps.insert(0, 0)
jumps.append(0)
len_jump = len(jumps)
for i in range(len_jump):
if jumps[i]>=width-1 & jumps[i]>= height-1:
jumps = jumps[0:i]
len_jump = len(jumps)
dp = dict()
dp[(0,0,0)] = input_matrix[0][0]
det_row = 0 # if i + det_row > width not need to jump anymore 0 can jump
det_col = 0 # 0 can jump, 1 can't jump
det = 0
det_break_jump = 0
det_jump = 1
mini = -1
det_mini = 0
for s in range(len_jump):
det_row = 0
if s==1:
mini = dp[(height-1,width-1,0)]
det_mini = 1
if s>1:
mini = min(mini,dp[height-1,width-1,s-1])
#else:
#mini = min(mini, dp[(i,j,s-1)])
#else:
if (det_jump == 0):
break
det_jump = 0
for i in range(height):
det_col = 0
if i + jumps[s] + 1 > height - 1: # can't jump row for now
det_row = 1
for j in range(width):
if j + jumps[s] + 1 > width - 1: # col can't jump for now
det_col = 1
try:
dp[(i, j, s)] == -2
except:
det = 1
else:
if det_col == 1: # col can't jump
if det_row == 0: # row can jump
if j == width - 1: # col can't walk
# if i < height - jumps[s] - 1: # can jump
try:
dp[(i+1,j,s)] == -2
except:
dp[(i+1,j,s)] = dp[(i,j,s)] + input_matrix[i+1][j]
else:
dp[(i+1,j,s)] = min(dp[(i+1,j,s)],dp[(i,j,s)] + input_matrix[i+1][j])
try:
dp[(i+jumps[s]+1,j,s+1)] == -2
except:
dp[(i + jumps[s] + 1, j, s + 1)] = dp[(i, j, s)] + input_matrix[i + jumps[s] + 1][j]
det_jump = 1
else:
if dp[(i+jumps[s]+1,j,s+1)] >= dp[(i,j,s)] + input_matrix[i+jumps[s]+1][j]:
dp[(i+jumps[s]+1,j,s+1)] = dp[(i,j,s)] + input_matrix[i+jumps[s]+1][j]
det_jump = 1
else: # col can walk
try:
dp[(i+1,j,s)] == -2
except:
dp[(i+1,j,s)] = dp[(i,j,s)] + input_matrix[i+1][j]
else:
dp[(i+1,j,s)] = min(dp[(i+1,j,s)],dp[(i,j,s)] + input_matrix[i+1][j])
try:
dp[(i,j+1,s)] == -2
except:
dp[(i,j+1,s)] = dp[(i,j,s)] + input_matrix[i][j+1]
else:
dp[(i,j+1,s)] = min(dp[(i,j+1,s)],dp[(i,j,s)] + input_matrix[i][j+1])
try:
dp[(i+jumps[s]+1,j,s+1)] == -2
except:
dp[(i + jumps[s] + 1, j, s + 1)] = dp[(i, j, s)] + input_matrix[i + jumps[s] + 1][j]
det_jump = 1
else:
if dp[(i+jumps[s]+1,j,s+1)] >= dp[(i,j,s)] + input_matrix[i+jumps[s]+1][j]:
dp[(i+jumps[s]+1,j,s+1)] = dp[(i,j,s)] + input_matrix[i+jumps[s]+1][j]
det_jump = 1
else: # det_row = 1 row can't jump
if j == width - 1: # col can't walk
if i != height - 1: # row can walk
try:
dp[(i+1,j,s)] == -2
except:
dp[(i+1,j,s)] = dp[(i,j,s)] + input_matrix[i+1][j]
else:
dp[(i+1,j,s)] = min(dp[(i+1,j,s)],dp[(i,j,s)] + input_matrix[i+1][j])
else: # col can walk
if i != height - 1: # row can walk
try:
dp[(i+1,j,s)] == -2
except:
dp[(i+1,j,s)] = dp[(i,j,s)] + input_matrix[i+1][j]
else:
dp[(i+1,j,s)] = min(dp[(i+1,j,s)],dp[(i,j,s)] + input_matrix[i+1][j])
try:
dp[(i, j + 1, s)] == -2
except:
dp[(i, j + 1, s)] = dp[(i, j, s)] + input_matrix[i][j + 1]
else:
dp[(i, j + 1, s)] = min(dp[(i, j + 1, s)],
dp[(i, j, s)] + input_matrix[i][j + 1])
else: # row can't walk
try:
dp[(i,j+1,s)] == -2
except:
dp[(i,j+1,s)] = dp[(i,j,s)] + input_matrix[i][j+1]
else:
dp[(i,j+1,s)] = min(dp[(i,j+1,s)],dp[(i,j,s)] + input_matrix[i][j+1])
else: # det_col = 0, col can jump
if det_row == 0:# row can jump
try:
dp[(i + 1, j, s)] == -2
except:
dp[(i + 1, j, s)] = dp[(i, j, s)] + input_matrix[i + 1][j]
else:
dp[(i + 1, j, s)] = min(dp[(i + 1, j, s)], dp[(i, j, s)] + input_matrix[i + 1][j])
try:
dp[(i, j + 1, s)] == -2
except:
dp[(i, j + 1, s)] = dp[(i, j, s)] + input_matrix[i][j + 1]
else:
dp[(i, j + 1, s)] = min(dp[(i, j + 1, s)], dp[(i, j, s)] + input_matrix[i][j + 1])
try:
dp[(i + jumps[s] + 1, j, s + 1)] == -2
except:
dp[(i + jumps[s] + 1, j, s + 1)] = dp[(i, j, s)] + input_matrix[i + jumps[s] + 1][j]
det_jump = 1
else:
if dp[(i + jumps[s] + 1,j,s+1)] >= dp[(i, j, s)] + input_matrix[i + jumps[s] + 1][j]:
dp[(i + jumps[s] + 1, j, s + 1)] = dp[(i, j, s)] + input_matrix[i + jumps[s] + 1][j]
det_jump = 1
try:
dp[(i, j + jumps[s] + 1, s + 1)] == -2
except:
dp[(i, j + jumps[s] + 1, s + 1)] = dp[(i, j, s)] + input_matrix[i][j+ jumps[s] + 1]
det_jump = 1
else:
if dp[(i, j + jumps[s] + 1, s + 1)] >= dp[(i, j, s)] + input_matrix[i][j + jumps[s] + 1]:
dp[(i, j + jumps[s] + 1, s + 1)] = dp[(i, j, s)] + input_matrix[i][j + jumps[s] + 1]
det_jump = 1
else: # det_row = 1 row can't jump
if i == height - 1: # row can't walk
try:
dp[(i, j + 1, s)] == -2
except:
dp[(i, j + 1, s)] = dp[(i, j, s)] + input_matrix[i][j + 1]
else:
dp[(i, j + 1, s)] = min(dp[(i, j + 1, s)], dp[(i, j, s)] + input_matrix[i][j + 1])
try:
dp[(i, j + jumps[s] + 1, s + 1)] == -2
except:
dp[(i, j + jumps[s] + 1, s + 1)] = dp[(i, j, s)] + input_matrix[i][j + jumps[s] + 1]
det_jump = 1
else:
if dp[(i, j + jumps[s] + 1, s + 1)] >= dp[(i, j, s)] + input_matrix[i][j + jumps[s] + 1]:
dp[(i, j + jumps[s] + 1, s + 1)] = dp[(i, j, s)] + input_matrix[i][j + jumps[s] + 1]
det_jump = 1
else: # row can walk
try:
dp[(i + 1, j, s)] == -2
except:
dp[(i + 1, j, s)] = dp[(i, j, s)] + input_matrix[i + 1][j]
else:
dp[(i + 1, j, s)] = min(dp[(i + 1, j, s)], dp[(i, j, s)] + input_matrix[i + 1][j])
try:
dp[(i, j + 1, s)] == -2
except:
dp[(i, j + 1, s)] = dp[(i, j, s)] + input_matrix[i][j + 1]
else:
dp[(i, j + 1, s)] = min(dp[(i, j + 1, s)], dp[(i, j, s)] + input_matrix[i][j + 1])
try:
dp[(i, j + jumps[s] + 1, s + 1)] == -2
except:
dp[(i, j + jumps[s] + 1, s + 1)] = dp[(i, j, s)] + input_matrix[i][j+ jumps[s] + 1]
det_jump = 1
else:
if dp[(i, j + jumps[s] + 1, s + 1)] >= dp[(i, j, s)] + input_matrix[i][j + jumps[s] + 1]:
dp[(i, j + jumps[s] + 1, s + 1)] = dp[(i, j, s)] + input_matrix[i][j + jumps[s] + 1]
det_jump = 1
# renew near element
#for i in range(height):
# for j in range(width):
mini = dp[(height-1,width-1,0)]
for i in range(len_jump ):
try:
if mini > dp[(height-1,width-1,i)]:
mini = dp[(height-1,width-1,i)]
except:
det = 0
print(mini)
实现(使用三维数组)
import copy
if __name__ == '__main__':
width, height = map(int, input().split())
input_matrix = [[-1 for i in range(width)]for j in range(height)]
for i in range(height):
input_matrix[i] = list(map(int, input().split()))
jumps = list(map(int, input().split()))
#jumps.insert(0, 0)
jumps.append(0)
len_jump = len(jumps)
for i in range(len_jump):
if jumps[i]>=width-1 & jumps[i]>= height-1:
jumps = jumps[0:i]
len_jump = len(jumps)
dp_plus = []
for k in range(len_jump):
dp_plus.append([])
for j in range(height):
dp_plus[k].append([])
for i in range(width):
dp_plus[k][j].append(-1)
#dp_plus = [[[0 for i in range(width)]for j in range(height)]for k in range(len_jump)]
#for i in range(height):
# input_matrix_buffer = copy.deepcopy(input_matrix[i])
# dp_plus[0][i] = input_matrix_buffer
#dp = dict()
#dp[(0,0,0)] = input_matrix[0][0]
dp_plus[0][0][0] = input_matrix[0][0]
det_row = 0 # if i + det_row > width not need to jump anymore 0 can jump
det_col = 0 # 0 can jump, 1 can't jump
det = 0
det_break_jump = 0
det_jump = 1
for s in range(len_jump):
det_row = 0
if (det_jump == 0 ):
break
det_jump = 0
for i in range(height):
det_col = 0
if i + jumps[s] + 1 > height - 1: # can't jump row for now
det_row = 1
for j in range(width):
if j + jumps[s] + 1 > width - 1: # col can't jump for now
det_col = 1
if dp_plus[s][i][j] != -1:
if det_col == 1: # col can't jump
if det_row == 0: # row can jump
if j == width - 1: # col can't walk
# if i < height - jumps[s] - 1: # can jump
if dp_plus[s][i+1][j] == -1:
dp_plus[s][i+1][j] = dp_plus[s][i][j] + input_matrix[i+1][j]
#dp[(i+1,j,s)] = dp[(i,j,s)] + input_matrix[i+1][j]
else:
dp_plus[s][i + 1][j] = min(dp_plus[s][i+1][j],dp_plus[s][i][j]+input_matrix[i+1][j])
#dp[(i+1,j,s)] = min(dp[(i+1,j,s)],dp[(i,j,s)] + input_matrix[i+1][j])
if s!= len_jump-1:
if dp_plus[s+1][i+jumps[s]+1][j] == -1:
dp_plus[s + 1][i + jumps[s] + 1][j] = dp_plus[s][i][j] + input_matrix[i + jumps[s] + 1][j]
#dp[(i+jumps[s]+1,j,s+1)] == -2
det_jump = 1
else:
if dp_plus[s+1][i+jumps[s]+1][j] >= dp_plus[s][i][j] + input_matrix[i + jumps[s] + 1][j]:
dp_plus[s + 1][i + jumps[s] + 1][j] = dp_plus[s][i][j] + input_matrix[i + jumps[s] + 1][j]
det_jump = 1
else: # col can walk
if dp_plus[s][i+1][j] == -1:
dp_plus[s][i + 1][j] = dp_plus[s][i][j] + input_matrix[i + 1][j]
#dp[(i+1,j,s)] == -2
#except:
#dp[(i+1,j,s)] = dp[(i,j,s)] + input_matrix[i+1][j]
else:
dp_plus[s][i+1][j] = min(dp_plus[s][i+1][j],dp_plus[s][i][j] + input_matrix[i + 1][j])
#try:
#dp[(i,j+1,s)] == -2
if dp_plus[s][i][j+1] == -1:
dp_plus[s][i][j+1] = dp_plus[s][i][j] + input_matrix[i][j+1]
#except:
#dp[(i,j+1,s)] = dp[(i,j,s)] + input_matrix[i][j+1]
else:
#dp[(i,j+1,s)] = min(dp[(i,j+1,s)],dp[(i,j,s)] + input_matrix[i][j+1])
dp_plus[s][i][j + 1] = min(dp_plus[s][i][j+1],dp_plus[s][i][j] + input_matrix[i][j+1])
#try:
#dp[(i+jumps[s]+1,j,s+1)] == -2
if s != len_jump - 1:
if dp_plus[s+1][i+jumps[s]+1][j] == -1:
dp_plus[s + 1][i + jumps[s] + 1][j] = dp_plus[s][i][j] + input_matrix[i + jumps[s] + 1][j]
#except:
#dp[(i + jumps[s] + 1, j, s + 1)] = dp[(i, j, s)] + input_matrix[i + jumps[s] + 1][j]
det_jump = 1
else:
if dp_plus[s + 1][i + jumps[s] + 1][j] >= dp_plus[s][i][j] + input_matrix[i + jumps[s] + 1][j]:
dp_plus[s + 1][i + jumps[s] + 1][j] = min(dp_plus[s + 1][i + jumps[s] + 1][j],dp_plus[s][i][j] + input_matrix[i + jumps[s] + 1][j])
det_jump = 1
else: # det_row = 1 row can't jump
if j == width - 1: # col can't walk
if i != height - 1: # row can walk
if dp_plus[s][i+1][j] == -1:
dp_plus[s][i + 1][j] = dp_plus[s][i][j] + input_matrix[i+1][j]
else:
dp_plus[s][i+1][j] = min(dp_plus[s][i+1][j],dp_plus[s][i][j] + input_matrix[i+1][j])
else: # col can walk
if i != height - 1: # row can walk
if dp_plus[s][i + 1][j] == -1:
dp_plus[s][i + 1][j] = dp_plus[s][i][j] + input_matrix[i + 1][j]
else:
dp_plus[s][i + 1][j] = min(dp_plus[s][i + 1][j],
dp_plus[s][i][j] + input_matrix[i + 1][j])
if dp_plus[s][i][j + 1] == -1:
dp_plus[s][i][j + 1] = dp_plus[s][i][j] + input_matrix[i][j + 1]
# except:
# dp[(i,j+1,s)] = dp[(i,j,s)] + input_matrix[i][j+1]
else:
# dp[(i,j+1,s)] = min(dp[(i,j+1,s)],dp[(i,j,s)] + input_matrix[i][j+1])
dp_plus[s][i][j + 1] = min(dp_plus[s][i][j + 1],
dp_plus[s][i][j] + input_matrix[i][j + 1])
else: # row can't walk
if dp_plus[s][i][j + 1] == -1:
dp_plus[s][i][j + 1] = dp_plus[s][i][j] + input_matrix[i][j + 1]
# except:
# dp[(i,j+1,s)] = dp[(i,j,s)] + input_matrix[i][j+1]
else:
# dp[(i,j+1,s)] = min(dp[(i,j+1,s)],dp[(i,j,s)] + input_matrix[i][j+1])
dp_plus[s][i][j + 1] = min(dp_plus[s][i][j + 1],
dp_plus[s][i][j] + input_matrix[i][j + 1])
else: # det_col = 0, col can jump
if det_row == 0:# row can jump
if dp_plus[s][i + 1][j] == -1:
dp_plus[s][i + 1][j] = dp_plus[s][i][j] + input_matrix[i + 1][j]
else:
dp_plus[s][i + 1][j] = min(dp_plus[s][i + 1][j],
dp_plus[s][i][j] + input_matrix[i + 1][j])
if dp_plus[s][i][j + 1] == -1:
dp_plus[s][i][j + 1] = dp_plus[s][i][j] + input_matrix[i][j + 1]
# except:
# dp[(i,j+1,s)] = dp[(i,j,s)] + input_matrix[i][j+1]
else:
# dp[(i,j+1,s)] = min(dp[(i,j+1,s)],dp[(i,j,s)] + input_matrix[i][j+1])
dp_plus[s][i][j + 1] = min(dp_plus[s][i][j + 1],
dp_plus[s][i][j] + input_matrix[i][j + 1])
if s != len_jump - 1:
if dp_plus[s + 1][i + jumps[s] + 1][j] == -1:
dp_plus[s + 1][i + jumps[s] + 1][j] = dp_plus[s][i][j] + input_matrix[i + jumps[s] + 1][
j]
# except:
# dp[(i + jumps[s] + 1, j, s + 1)] = dp[(i, j, s)] + input_matrix[i + jumps[s] + 1][j]
det_jump = 1
else:
if dp_plus[s + 1][i + jumps[s] + 1][j] >= dp_plus[s][i][j] + \
input_matrix[i + jumps[s] + 1][j]:
dp_plus[s + 1][i + jumps[s] + 1][j] = min(dp_plus[s + 1][i + jumps[s] + 1][j],
dp_plus[s][i][j] +
input_matrix[i + jumps[s] + 1][j])
det_jump = 1
#try:
#dp[(i, j + jumps[s] + 1, s + 1)] == -2
if dp_plus[s+1][i][j+jumps[s]+1] == -1:
#except:
#dp[(i, j + jumps[s] + 1, s + 1)] = dp[(i, j, s)] + input_matrix[i][j+ jumps[s] + 1]
dp_plus[s + 1][i][j + jumps[s] + 1] = dp_plus[s][i][j] + input_matrix[i][j + jumps[s] + 1]
det_jump = 1
else:
if dp_plus[s + 1][i][j + jumps[s] + 1] >= dp_plus[s][i][j] + input_matrix[i][j + jumps[s] + 1]:
dp_plus[s + 1][i][j + jumps[s] + 1] = dp_plus[s][i][j] + input_matrix[i][j + jumps[s] + 1]
det_jump = 1
else: # det_row = 1 row can't jump
if i == height - 1: # row can't walk
if dp_plus[s][i][j + 1] == -1:
dp_plus[s][i][j + 1] = dp_plus[s][i][j] + input_matrix[i][j + 1]
# except:
# dp[(i,j+1,s)] = dp[(i,j,s)] + input_matrix[i][j+1]
else:
# dp[(i,j+1,s)] = min(dp[(i,j+1,s)],dp[(i,j,s)] + input_matrix[i][j+1])
dp_plus[s][i][j + 1] = min(dp_plus[s][i][j + 1],
dp_plus[s][i][j] + input_matrix[i][j + 1])
if s != len_jump - 1:
if dp_plus[s + 1][i][j + jumps[s] + 1] == -1:
# except:
# dp[(i, j + jumps[s] + 1, s + 1)] = dp[(i, j, s)] + input_matrix[i][j+ jumps[s] + 1]
dp_plus[s + 1][i][j + jumps[s] + 1] = dp_plus[s][i][j] + input_matrix[i][
j + jumps[s] + 1]
det_jump = 1
else:
if dp_plus[s + 1][i][j + jumps[s] + 1] >= dp_plus[s][i][j] + input_matrix[i][
j + jumps[s] + 1]:
dp_plus[s + 1][i][j + jumps[s] + 1] = dp_plus[s][i][j] + input_matrix[i][
j + jumps[s] + 1]
det_jump = 1
else: # row can walk
if dp_plus[s][i + 1][j] == -1:
dp_plus[s][i + 1][j] = dp_plus[s][i][j] + input_matrix[i + 1][j]
else:
dp_plus[s][i + 1][j] = min(dp_plus[s][i + 1][j],
dp_plus[s][i][j] + input_matrix[i + 1][j])
if dp_plus[s][i][j + 1] == -1:
dp_plus[s][i][j + 1] = dp_plus[s][i][j] + input_matrix[i][j + 1]
# except:
# dp[(i,j+1,s)] = dp[(i,j,s)] + input_matrix[i][j+1]
else:
# dp[(i,j+1,s)] = min(dp[(i,j+1,s)],dp[(i,j,s)] + input_matrix[i][j+1])
dp_plus[s][i][j + 1] = min(dp_plus[s][i][j + 1],
dp_plus[s][i][j] + input_matrix[i][j + 1])
if s != len_jump - 1:
if dp_plus[s + 1][i][j + jumps[s] + 1] == -1:
# except:
# dp[(i, j + jumps[s] + 1, s + 1)] = dp[(i, j, s)] + input_matrix[i][j+ jumps[s] + 1]
dp_plus[s + 1][i][j + jumps[s] + 1] = dp_plus[s][i][j] + input_matrix[i][
j + jumps[s] + 1]
det_jump = 1
else:
if dp_plus[s + 1][i][j + jumps[s] + 1] >= dp_plus[s][i][j] + input_matrix[i][
j + jumps[s] + 1]:
dp_plus[s + 1][i][j + jumps[s] + 1] = dp_plus[s][i][j] + input_matrix[i][
j + jumps[s] + 1]
det_jump = 1
# renew near element
#for i in range(height):
# for j in range(width):
mini = dp_plus[0][height-1][width-1]
for i in range(len_jump):
if dp_plus[i][height-1][width-1] != -1:
if mini > dp_plus[i][height-1][width-1]:
mini = dp_plus[i][height-1][width-1]
print(mini)
sample dictionary
对于sample,最后我们会得到这样的一个dict
{(0, 0, 0): 1, (1, 0, 0): 9, (0, 1, 0): 1, (2, 0, 1): 10, (0, 2, 1): 4, (1, 1, 0): 4, (0, 2, 0): 4, (2, 1, 1): 8, (0, 3, 1): 8, (1, 2, 0): 11, (0, 3, 0): 11, (2, 2, 1): 12, (0, 4, 1): 6, (1, 3, 0): 17, (0, 4, 0): 13, (2, 3, 1): 12, (0, 5, 1): 11, (1, 4, 0): 22, (0, 5, 0): 18, (2, 4, 1): 13, (1, 5, 0): 26, (2, 5, 1): 14, (2, 0, 0): 18, (3, 0, 1): 12, (1, 2, 1): 11, (2, 1, 0): 11, (3, 1, 1): 6, (1, 3, 1): 10, (2, 2, 0): 19, (3, 2, 1): 15, (1, 4, 1): 15, (2, 3, 0): 19, (3, 3, 1): 13, (1, 5, 1): 19, (2, 4, 0): 20, (3, 4, 1): 20, (2, 5, 0): 21, (3, 5, 1): 22, (3, 0, 0): 21, (3, 1, 0): 13, (3, 2, 0): 22, (3, 3, 0): 20, (3, 4, 0): 27, (3, 5, 0): 29, (2, 2, 2): 12, (0, 4, 2): 6, (2, 3, 2): 10, (0, 5, 2): 11, (2, 4, 2): 7, (2, 5, 2): 8, (3, 2, 2): 20, (1, 4, 2): 15, (3, 3, 2): 7, (1, 5, 2): 18, (3, 4, 2): 14, (3, 5, 2): 16, (1, 4, 3): 15, (0, 5, 3): 11, (1, 5, 3): 19, (2, 4, 3): 11, (2, 5, 3): 8, (3, 2, 3): 21, (2, 3, 3): 14, (3, 3, 3): 11, (3, 4, 3): 14, (3, 5, 3): 16}