Python 2, 154 byte
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]
Un approccio DP semplice. Una buona parte del programma sta solo leggendo l'input.
Spiegazione
Calcoliamo una tabella di programmazione dinamica 2D in cui ogni riga corrisponde ai primi nparcheggi e ogni colonna corrisponde al numero di camion (o parti di un camion) posizionati finora. In particolare, colonna ksignifica che k//Lfinora abbiamo posizionato camion completi e siamo k%Lsulla strada per un nuovo camion. Ogni cella è quindi il numero minimo di auto da cancellare per raggiungere lo stato (n,k), e il nostro stato target è (P, L*T).
L'idea alla base della ricorrenza DP è la seguente:
- Se siamo
k%L > 0spazi per un nuovo camion, la nostra unica opzione è quella di essere k%L-1spazi per un nuovo camion
- Altrimenti, se
k%L == 0poi avessimo appena finito un nuovo camion o avessimo già finito l'ultimo camion e da allora abbiamo saltato alcuni parcheggi. Prendiamo il minimo delle due opzioni.
Se k > n, ad esempio, abbiamo piazzato più caselle di camion di quanti siano i parcheggi, allora mettiamo lo ∞stato (n,k). Ma ai fini del golf, mettiamo kdal momento che questo è il caso peggiore di rimuovere ogni macchina, e serve anche come limite superiore.
Questo è stato un bel boccone, quindi facciamo un esempio, diciamo:
5 1 3
..##.
Le ultime due righe della tabella sono
[0, 1, 2, 1, 2, ∞]
[0, 0, 1, 1, 1, 2]
La voce all'indice 2 della seconda ultima riga è 2, perché per raggiungere uno stato di 2//3 = 0camion pieni posizionati ed essere 2%3 = 2spazi per un nuovo camion, questa è l'unica opzione:
TT
..XX
Ma l'ingresso all'indice 3 della seconda ultima riga è 1, perché per raggiungere uno stato di 3//3 = 1camion pieni posizionati ed essere 3%3 = 0spazi per un nuovo camion, l'ottimale è
TTT
..X#
La voce all'indice 3 dell'ultima riga considera le due celle sopra come opzioni: prendiamo il caso in cui ci sono 2 spazi per un nuovo camion e lo finiamo, oppure prendiamo il caso in cui abbiamo un camion pieno Già finito?
TTT TTT
..XX. vs ..X#.
Chiaramente quest'ultimo è meglio, quindi mettiamo giù un 1.
Pyth, 70 byte
JmvdczdKw=GUhhJVhJ=HGFTUhN XHhThS>,@GhT+@GTq@KN\#>%hT@J2Z)=GH)@G*@J1eJ
Fondamentalmente una porta del codice sopra. Non molto ancora golfato. Provalo online
allargato
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]])
Ora, se solo Pyth avesse assegnazioni multiple a> 2 variabili ...
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]))