Python 2, 154 Bytes
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]
Ein unkomplizierter DP-Ansatz. Ein fairer Teil des Programms liest nur Eingaben.
Erläuterung
Wir berechnen eine dynamische 2D-Programmiertabelle, in der jede Zeile den ersten n
Parkplätzen entspricht und jede Spalte der Anzahl der bisher platzierten LKWs (oder Teile eines LKWs) entspricht. Insbesondere k
bedeutet Spalte , dass wir bisher k//L
volle LKWs platziert haben und k%L
auf dem Weg zu einem neuen LKW sind. Jede Zelle ist dann die minimale Anzahl von Autos, die gelöscht werden müssen, um den Zustand zu erreichen (n,k)
, und unser Zielzustand ist (P, L*T)
.
Die Idee hinter der DP-Wiederholung ist die folgende:
- Wenn wir Platz
k%L > 0
für einen neuen LKW haben, besteht unsere einzige Möglichkeit darin, Platz k%L-1
für einen neuen LKW zu haben
- Andernfalls, wenn
k%L == 0
wir dann entweder gerade einen neuen LKW fertiggestellt haben oder den letzten LKW bereits fertiggestellt haben und seitdem einige Parkplätze übersprungen haben. Wir nehmen das Minimum der beiden Optionen.
Wenn k > n
wir also mehr LKW-Plätze platziert haben, als es Parkplätze gibt, dann setzen wir ∞
auf Staat (n,k)
. Aber zum Zwecke des Golfspiels setzen wir, k
da dies der schlimmste Fall ist, jedes Auto zu entfernen, und auch als Obergrenze dient.
Das war ein ziemlicher Schluck, also lassen Sie uns ein Beispiel geben, sagen wir:
5 1 3
..##.
Die letzten beiden Zeilen der Tabelle sind
[0, 1, 2, 1, 2, ∞]
[0, 0, 1, 1, 1, 2]
Der Eintrag bei Index 2 der vorletzten Zeile ist 2, da dies die einzige Option ist, um einen Zustand 2//3 = 0
voller platzierter LKWs zu erreichen, die platziert sind und Platz 2%3 = 2
für einen neuen LKW bieten:
TT
..XX
Der Eintrag bei Index 3 der vorletzten Zeile ist jedoch 1, da das Optimum erreicht ist , um einen Zustand 3//3 = 1
voller platzierter LKWs zu erreichen, die Platz 3%3 = 0
für einen neuen LKW bieten
TTT
..X#
Der Eintrag in Index 3 der letzten Zeile betrachtet die beiden oben genannten Zellen als Optionen. Nehmen wir den Fall, in dem wir zwei Leerzeichen für einen neuen LKW haben, und beenden Sie ihn, oder nehmen wir den Fall, in dem wir einen vollen LKW haben schon fertig?
TTT TTT
..XX. vs ..X#.
Letzteres ist eindeutig besser, also setzen wir eine 1.
Pyth, 70 Bytes
JmvdczdKw=GUhhJVhJ=HGFTUhN XHhThS>,@GhT+@GTq@KN\#>%hT@J2Z)=GH)@G*@J1eJ
Grundsätzlich ein Port des obigen Codes. Noch nicht sehr gut Golf gespielt. Probieren Sie es online aus
Erweitert
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]])
Wenn nur Pyth mehrere Zuordnungen zu> 2 Variablen hätte ...
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('#')
Als Variablex=l[i][1];del Q[x:x+L]
Haskell, 196 Zeichen
Führt alle Beispiele aus
Etwas langsam: O (2 ^ P) wo P ist die Größe des Loses.
Wahrscheinlich gibt es hier noch viel zu golfen.
quelle