Если под «более эффективным» вы подразумеваете «может быть правильным», то да .Ваш текущий код не работает для всех входов.С этим «подстановочным знаком» SQR вы не можете легко узнать, полезна ли операция, на которую вы смотрите.Например,
LDI 1
ADD -8
LDI 2
ADD -1
ADD 3
SQR
Максимальное значение получается из (-8 + -1) ^ 2.Вы должны использовать динамическое программирование (см. Ссылку, приведенную в первом комментарии), чтобы отслеживать все «наилучшие возможные» результаты на каждом шаге.
Вы классически программируете это с помощью рекурсивной подпрограммы, которая пробует две ветви, как считаеткаждая инструкция: используйте / не используйте эту инструкцию в окончательном ответе.Затем вы возвращаетесь с текущим значением X
и оставшимся списком инструкций.
Если вы хотите, чтобы провел анализ потока данных, вы можете применять различные короткие пути.Например, в любом потоке ADD
инструкций вы можете объединить все отрицательные и все положительные значения в один ADD
.Когда у вас есть LDI
, вы учитываете, больше ли новое значение как в истинном, так и в абсолютном значении - последнее является тем, что приводит к улучшению через SQR
.
Честно говоря, я рекомендую сделать пополамrecur-dynamic_programming route.
ОБНОВЛЕНИЕ
Я больше об этом думал.Хотя DP - это путь для решения больших проблем, это - , а не , что вы хотите атаковать первым (на мой взгляд).Скорее, атакуйте проблему того, стоит ли включать каждую конкретную команду.Вам нужно будет сделать оба, до дальнейшей доработки.Вы даже не можете гарантировать, что хотите включить команду SQR
: последующее вычитание может сделать ее нежелательной.
Логика рекурсии выглядит примерно так:
def optimize(x_reg, command_list):
# x_reg current value of the X register
# command_list remaining list of commands
# base case
if len(command_list) == 0
return x_reg
# recursion case
op = command_list[0][0]
if op == "ADD":
new_x = x_reg + command_list[0][1]
elif op == "LDI":
new_x = command_list[0][1]
else: # op == "SQR":
new_x = x_reg * x_reg
with_op = optimize(new_x, command_list[1:]) # Use the command
sans_op = optimize(x_reg, command_list[1:]) # Don't use the command
return max(with_op, sans_op) # Return the larger of the two solutions found