Python 2, 154 байта
I,R=raw_input,range
P,T,L=map(int,I().split())
S=I()
D=R(P+1)
for r in R(P):D[1:r+2]=[min([D[c],D[c-1]+(S[r]<".")][c%L>0:])for c in R(1,r+2)]
print D[T*L]
Простой подход DP. Большая часть программы просто читает входные данные.
объяснение
Мы рассчитываем таблицу динамического двухмерного программирования, где каждая строка соответствует первому месту n
парковки, а каждый столбец соответствует количеству грузовиков (или частей грузовика), размещенных до настоящего времени. В частности, столбец k
означает, что мы уже установили k//L
полные грузовики и готовимся k%L
к новому грузовику. Тогда каждая ячейка - это минимальное количество машин, которое нужно очистить, чтобы достичь штата (n,k)
, и наша целевая задача - (P, L*T)
.
Идея повторения DP заключается в следующем:
- Если у нас есть
k%L > 0
места для нового грузовика, то наш единственный вариант - это быть k%L-1
рядом с новым грузовиком
- В противном случае, если
k%L == 0
мы только что закончили новый грузовик или уже закончили последний грузовик и с тех пор пропустили несколько парковочных мест. Мы берем минимум из двух вариантов.
Если k > n
, т. Е. Мы разместили больше площадей для грузовиков, чем парковочных мест, то мы ставим ∞
для штата (n,k)
. Но для целей игры в гольф мы ставим, k
так как это наихудший случай удаления каждой машины, а также служит верхней границей.
Это было довольно много, так что давайте рассмотрим пример:
5 1 3
..##.
Последние две строки таблицы
[0, 1, 2, 1, 2, ∞]
[0, 0, 1, 1, 1, 2]
Запись по индексу 2 во втором последнем ряду - 2, потому что для достижения состояния 2//3 = 0
полностью заполненных грузовиков и 2%3 = 2
мест для нового грузовика это единственный вариант:
TT
..XX
Но запись по индексу 3 второго последнего ряда равна 1, потому что для достижения состояния 3//3 = 1
заполненных грузовиков и свободного 3%3 = 0
пространства для нового грузовика оптимальным является
TTT
..X#
Запись в индексе 3 последнего ряда рассматривает две вышеупомянутые ячейки как варианты - возьмем ли мы случай, когда мы находимся на 2 пробела для нового грузовика, и закончим его, или мы возьмем случай, когда у нас есть полный грузовик уже закончен?
TTT TTT
..XX. vs ..X#.
Очевидно, что последний лучше, поэтому мы ставим 1.
Pyth, 70 байт
JmvdczdKw=GUhhJVhJ=HGFTUhN XHhThS>,@GhT+@GTq@KN\#>%hT@J2Z)=GH)@G*@J1eJ
В основном порт вышеуказанного кода. Пока не очень хорошо играли в гольф. Попробуйте онлайн
расширенный
Jmvdczd J = map(eval, input().split(" "))
Kw K = input()
=GUhhJ G = range(J[0]+1)
VhJ for N in range(J[0]):
=HG H = G[:]
FTUhN for T in range(N+1):
XHhT H[T+1] =
hS sorted( )[0]
> [ :]
, ( , )
@GhT G[T+1]
+@GTq@KN\# G[T]+(K[N]=="#")
>%hT@J2Z (T+1)%J[2]>0
)=GH G = H[:]
)@G*@J1eJ print(G[J[1]*J[-1]])
Теперь, если бы только Pyth имел множественное назначение> 2 переменным ...
P,K,L=map(int,input().split())
Q=list(input()) l=[(L,0)]*K for j in range(len(Q)-L): if Q[j:j+L].count('#')<l[i][0]: l[i]=Q[j:j+L].count('#'),j del Q[l[i][1]:l[i][1]+L] print(sum([x[0]for x in l]))
Q=list(input()) -> *Q,=input()
Q[j:j+L].count('#')
как переменную, 2)x=l[i][1];del Q[x:x+L]
,Haskell, 196 символов
Запускает все примеры
Несколько медленно: O (2 ^ P), где P - размер лота.
Вероятно, много осталось до гольфа здесь.
источник