索引从0开始
[-1, -1, 1, 7, 4, 2, 0, 8, 10, 18, 22, 20, 28, 80, 88, 108, 188, 200, 208, 288, 808, 888, 1088, 1888, 2008, 2088, 2888, 8088, 8888, 10888, 18888, 20088, 20888, 28888, 80888, 88888, 108888, 188888, 200888, 208888, 288888, 808888, 888888, 1088888, 1888888, 2008888, 2088888, 2888888, 8088888, 8888888, 10888888]
代码:
#0: 6, 1: 2 , 2: 5, 3: 5, 4: 4, 5: 5, 6: 6, 7: 3, 8: 7, 9: 6
#2根: 1, 5根: 2, 4根:4, 6根: 6 / 0, 3根: 7, 7根: 8
#1根: nan
#8 = 1 + 7....4 + 4
#8根: min(27, 44, 10)
#对于n根火柴,可以拆分为从(1, n - 1)....(n / 2, n / 2)[n为偶数]
#拆分为(1, n - 1)...(n // 2, n // 2 + 1)[n为奇数]
#dp[n]代表火柴个数为n的情况下的最小值,从8开始
#base代表不同火柴下的最小值
# base = {2: '1', 3: '7', 4: '4', 5: '2', 6: '0', 7: '8'}
res = []
t = int(input())
dp = [-1, -1, 1, 7, 4, 2, 0, 8] + [0x3f3f3f3f3f3f3f3f] * 43
for _ in range(t):
nums = int(input())
#代表已经计算完毕
if dp[nums] != 0x3f3f3f3f3f3f3f3f:
res.append(str(dp[nums] if dp[nums] != 0 else 6))
continue
#计算从8到nums的最小值
for i in range(8, nums + 1):
#如果计算完毕就跳过
if dp[i] != 0x3f3f3f3f3f3f3f3f:
continue
for j in range(2, i // 2 + 1):
x = int(str(dp[j]) + str(dp[i - j]))
y = int(str(dp[i - j]) + str(dp[j]))
#x不含前导0
if dp[j] != 0 or dp[i - j] != 0:
#x含前导0, y必然不含前导0
if dp[j] == 0:
dp[i] = min(dp[i], y)
elif dp[i - j] == 0:
dp[i] = min(dp[i], x)
else:
dp[i] = min(dp[i], min(x, y))
res.append(str(dp[nums]))
print(dp)