optimize memo

Verifying solution...
All test cases passed. Use submit solution.py to submit your solution
This commit is contained in:
Seongbeom Park 2022-02-19 03:56:45 +09:00
parent 5a389fa439
commit 7abab70efb

View File

@ -8,25 +8,26 @@ def solution(g):
#print height, width #print height, width
memo = {} memo = {}
prev_cases = {} prev_cases = {i:1 for i in range(2**(height+1))}
for i in range(2**(height+1)): #for i in range(2**(height+1)):
prev_cases[i] = 1 # prev_cases[i] = 1
memo[i] = {} # memo[i] = {j:calculate_c_column(i, j, height) for j in range(2**(height+1))}
for j in range(2**(height+1)):
memo[i][j] = calculate_c_column(i, j, height)
#print memo #print memo
#print prev_cases #print prev_cases
for column in range(width): for column in range(width):
cases = {} cases = {}
for i in range(2**(height+1)): c = list_to_int(grid[:,column])
cases[i] = 0
#print grid[:,column], list_to_int(grid[:,column]) #print grid[:,column], list_to_int(grid[:,column])
for i in range(2**(height+1)): for i in prev_cases.keys():
if prev_cases[i] == 0: if not i in memo:
continue memo[i] = {}
for j in range(2**(height+1)): if not c in memo[i]:
if memo[i][j] == list_to_int(grid[:,column]): memo[i][c] = [j for j in range(2**(height+1)) if calculate_c_column(i, j, height) == c]
for j in memo[i][c]:
if not j in cases:
cases[j] = 0
if i in prev_cases:
cases[j] += prev_cases[i] cases[j] += prev_cases[i]
#print cases #print cases
prev_cases = cases prev_cases = cases
@ -43,11 +44,11 @@ def print_grid(g):
print line print line
def calculate_c_column(i, j, length): def calculate_c_column(i, j, length):
mask = 2**(length)-1 mask = 2**length-1
multi_ones = ((i&j)|((i&j)>>1)) & mask multiple_ones = ((i&j)|((i&j)>>1)) & mask
odd_ones = ((i^j)^((i^j)>>1)) & mask odd_ones = ((i^j)^((i^j)>>1)) & mask
single_one = (~multi_ones & odd_ones) & mask single_one = (~multiple_ones & odd_ones) & mask
#print ' '.join(('{:0'+str(length)+'b}').format(k) for k in [i, j]), ' '.join(('{:0'+str(length-1)+'b}').format(k) for k in [multi_ones, odd_ones, single_one]) #print ' '.join(('{:0'+str(length)+'b}').format(k) for k in [i, j]), ' '.join(('{:0'+str(length-1)+'b}').format(k) for k in [multiple_ones, odd_ones, single_one])
return single_one return single_one
#l=3 #l=3
@ -78,6 +79,7 @@ tests = [
([[True, False]], 10), ([[True, False]], 10),
([[False, True]], 10), ([[False, True]], 10),
([[False, False]], 38), ([[False, False]], 38),
#([[True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]], 1),
] ]
for (i, o) in tests: for (i, o) in tests: