memoization and early termination

Verifying solution...
Test 1 passed!
Test 2 passed!
Test 3 failed  [Hidden]
Test 4 passed! [Hidden]
Test 5 failed  [Hidden]
This commit is contained in:
Seongbeom Park 2022-04-24 05:37:10 +09:00
parent cf6d493914
commit 6269b9b896

View File

@ -1,12 +1,15 @@
def solution(banana_list): def solution(banana_list):
fewest_possible_number = len(banana_list) fewest_possible_number = len(banana_list)
memo = {}
for pairs in generate_trainer_pairs(list(range(len(banana_list)))): for pairs in generate_trainer_pairs(list(range(len(banana_list)))):
possible_number = len(banana_list) possible_number = len(banana_list)
for i, j in pairs: for i, j in pairs:
if check_loop(banana_list[i], banana_list[j]): if check_loop(banana_list[i], banana_list[j], memo):
possible_number -= 2 possible_number -= 2
if possible_number < fewest_possible_number: if possible_number < fewest_possible_number:
fewest_possible_number = possible_number fewest_possible_number = possible_number
if fewest_possible_number < 2: # early termination
break
return fewest_possible_number return fewest_possible_number
import copy import copy
@ -15,28 +18,25 @@ def generate_trainer_pairs(trainer_id_list):
yield [] yield []
else: else:
first_id = trainer_id_list[0] first_id = trainer_id_list[0]
temp_list = copy.deepcopy(trainer_id_list) for second_id in trainer_id_list[1:]:
temp_list.remove(first_id) reduced_list = copy.deepcopy(trainer_id_list)
for second_id in temp_list: seduced_list.remove(first_id)
tt_list = copy.deepcopy(temp_list) reduced_list.remove(second_id)
tt_list.remove(second_id) for pairs in generate_trainer_pairs(reduced_list):
for pairs in generate_trainer_pairs(tt_list):
yield [(first_id, second_id)] + pairs yield [(first_id, second_id)] + pairs
def check_loop(x, y): def check_loop(a, b, memo):
if (x + y) % 2 == 1: # sum is odd
return True
a, b = x, y
memo = []
while a != b:
if a > b:
a, b = a - b, 2*b
else:
a, b = 2*a, b - a
if (a, b) in memo: if (a, b) in memo:
return memo[(a, b)]
while a != b:
if (a + b) % 2 == 1: # sum is odd
memo[(a, b)] = True
return True return True
if a > b:
a, b = (a - b)/2, b
else: else:
memo += [(a, b)] a, b = a, (b - a)/2
memo[(a, b)] = False
return False return False
tests = [ tests = [