Представьте, что у вас есть специальная клавиатура со следующими клавишами:
Клавиша 1: (A): печатать одну букву «А» на экране.
Клавиша 2: (Ctrl-A): выделение всего экрана.
Клавиша 3: (Ctrl-C): копирование выделения в буфер.
Клавиша 4: (Ctrl-V): печать буфера на экране, добавление его послето, что уже было напечатано.
Теперь вы можете нажимать клавиатуру только N раз (с четырьмя вышеуказанными клавишами), узнать максимальное число символов «А», которое вы можете напечатать на экране.
Пример 1:
Вход: N = 3
Выход: 3
Объяснение: Мы можем получить максимум 3 Анажмите следующую последовательность клавиш: A, A, A
Пример 2:
Ввод: N = 7
Выход: 9
Объяснение:Мы можем получить максимум 9 A на экране, нажав следующую последовательность клавиш: A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V
(ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я НЕ ХОЧУ СЛУШАТЬ РАЗНОЕ РЕШЕНИЕ. Я просто хочу понять, что яотсутствует и как это исправить.)
Вот мое текущее (неправильное) решение (пояснение ниже):
class Solution:
def maxA(self, N):
screen = [0] * N
screen[0] = 1
applied_clipboard = clipboard = select = 0
for i in range(1, N):
if i < 3:
screen[i] = screen[i-1] + 1
else:
screen[i] = max(screen[i-3] + clipboard, screen[i-1] + 1, screen[i-1] + applied_clipboard)
if screen[i] == screen[i-3] + clipboard:
applied_clipboard = clipboard
select, clipboard = max(select, screen[i-1]), max(clipboard, select)
return screen[-1]
Есть несколько состояний, которые я отслеживаю, как вы можете видеть в приведенном выше коде.Состояния:
- Сколько символов я выбрал?
- Сколько символов я напечатал на экране?
- Сколько символов в моем буфере обмена?
- Какой самый последний буфер обмена, который я на самом деле применил?
С этими частями состояния я считаю, что могу принимать оптимальные решения на каждом этапе.
Однако мой код неверен.Для ввода N = 11
мой код возвращает 27
, и правильное значение - 27
.Однако для N=9
и N=10
правильными значениями являются 16
и 20
(соответственно), но я получаю 15
и 18
(соответственно).
Кто-нибудь видит ошибку в том, как я обновляю состояние?
РЕДАКТИРОВАТЬ.Отвечая на существующие ответы: Я понимаю, что мое обновление состояния может быть неполным, но вопрос в том, где.Моя идея здесь состояла в том, чтобы максимизировать каждый кусочек государства, поскольку существует отдельная серия решений для максимизации каждого кусочка государства.Затем используйте всю эту информацию для обновления состояния в следующей итерации.
Переписал мой код, чтобы сохранить состояние каждой части.
class Solution:
def maxA(self, N):
screen = [0] * N
screen[0] = 1
applied_clipboard, clipboard, select = [[0] * N for _ in range(3)]
for i in range(1, N):
if i < 3:
screen[i] = screen[i-1] + 1
else:
screen[i] = max(screen[i-3] + clipboard[i-1], screen[i-1] + 1, screen[i-1] + applied_clipboard[i-1])
if screen[i] == screen[i-3] + clipboard[i-1]:
applied_clipboard[i] = clipboard[i-1]
else:
applied_clipboard[i] = applied_clipboard[i-1]
select[i] = max(select[i-1], screen[i-1])
clipboard[i] = max(clipboard[i-1], select[i-1])
print('screen', screen)
print('clipboard', clipboard)
print('applied', applied_clipboard)
return screen[-1]
Я думаю, что меня смущает то, как сохранить то, какое значение буфера обмена было применено (applied_clipboard
) по сравнению с тем, каково максимальное состояние буфера обмена.Но мне нужно провести различие между ними, так как это влияет на повторяемость отношений.
Спасибо user3386109
за подсказку, что:
- Правильный ряд шагов для
N=9
равен AAAASCVVV
(всего 16 А) - Мой код для
N=9
, выводит AAASCVVVV
(всего 15 A).
, где s = выбор, c = копирование и v = вставка.