Головоломка: Xsquare And Chocolates Bars
Мой подход:
3 предмета из 1 набора.
Необходимо найти самые длинные последовательные наборы, чтобы всекусочки в наборе не совпадают.
Затем вычтите это из общей длины плитки шоколада.
Начните с индекса 1 (на основе 0).
Разделите
Случай 1 : Если части совпадают, не учитывайте текущий индекс.
Поиск по следующему индексу.
if bar[current - 1] == bar[current] and bar[current] == bar[current + 1]:
if dp[current + 1] == -1:
dp[current + 1] = CountConsecutiveSets(current + 1)
dp[current] = dp[current + 1]
return dp[current]
Случай 2 : Еслиштуки разные
Случай 2.1 : Рассмотреть текущий набор: Счет 1 для текущего набора и найти количество оставшихся наборов после текущего набора.
if dp[current + 3] == -1:
dp[current + 3] = CountConsecutiveSets(current + 3)
withCurrent = 1 + dp[current + 3]
Случай 2.2 : игнорировать текущий набор: найти остальные наборы из следующего текущего
if dp[current + 1] == -1:
dp[current + 1] = CountConsecutiveSets(current + 1)
withoutCurrent = dp[current + 1]
Поскольку необходимо найти максимальный последовательный набор, найдите max(Case 2.1 & Case 2.2)
.
Базовый случай:
Когда ток находится на последнем индексе (или больше, чем последний индекс), набор не может быть сформирован.
Итак, верните 0.
Full Coде * * * 1046 1047 1049 контрольный пример: 1052 * бар = "CCCSCCSSSCSCCSCSSCSCCCSSCCSCCCSCCSSSCCSCCCSCSCCCSSSCCSSSSCSCCCSCSSCSSSCSSSCSCCCSCSCSCSSSCS"
Ans: 39 Но выше код дает 6. Что не так в моем мышлении и как это исправить? גלעד ברקן's Сверху вниз логика: def CountRemainingCandies(self, bar):
dp = [-1] * len(bar)
def CountConsecutiveSets(current):
# Solve small sub-problems
if current <= 1:
dp[0] = dp[1] = 0
return 0
# Divide
# Case 1: Consider current
# If different candies
withCurrent = -1
if bar[current] != bar[current - 1] or bar[current] != bar[current - 2]:
if current - 3 < 0: current = 0
if dp[current - 3] == -1:
dp[current - 3] = CountConsecutiveSets(current - 3)
withCurrent = 1 + dp[current - 3]
# Case 2: Ignore current
if current - 1 < 0: current = 0
if dp[current - 1] == -1:
dp[current - 1] = CountConsecutiveSets(current - 1)
withoutCurrent = dp[current - 1]
# Combine
dp[current] = max(withCurrent, withoutCurrent)
return dp[current]
consecutiveSetsCount = CountConsecutiveSets(len(bar) - 1)
return len(bar) - 3 * consecutiveSetsCount
Я использую логику גלעד ברקן, но все еще получаю неправильный ответ для теста
bar = "CCCSCCSSSCSCCSCSSCSCCCSSCCSCCCSCCSSSCCSCCCSCSCCCSSSCCSSSSCSCCCSCSSCSSSCSSSCSCCCSCSCSCSSSCS"