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]
Прямий підхід ДП. Справедливий фрагмент програми - це лише читання матеріалів.
Пояснення
Ми обчислюємо 2D динамічну таблицю програмування, де кожен рядок відповідає першим 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 останнього рядка розглядає вищезазначені дві клітини як варіанти - чи візьмемо ми випадок, коли ми знаходимось на два пробіли для нової вантажівки, і закінчимо її, чи візьмемо випадок, коли у нас є повна вантажівка вже закінчили?
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]))