Python 2, 154 octets
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]
Une approche DP simple. Une bonne partie du programme ne fait que lire les entrées.
Explication
Nous calculons une table de programmation dynamique 2D où chaque ligne correspond aux premières n
places de stationnement, et chaque colonne correspond au nombre de camions (ou parties de camion) placés jusqu'à présent. En particulier, la colonne k
signifie que nous avons k//L
jusqu'à présent placé des camions pleins et que nous sommes k%L
en route pour un nouveau camion. Chaque cellule est alors le nombre minimal de voitures à nettoyer pour atteindre l'état (n,k)
, et notre état cible est (P, L*T)
.
L'idée derrière la récurrence du DP est la suivante:
- Si nous sommes des
k%L > 0
espaces pour un nouveau camion, alors notre seule option est d'avoir été des k%L-1
espaces pour un nouveau camion
- Sinon, si
k%L == 0
nous venons de terminer un nouveau camion, ou si nous avions déjà terminé le dernier camion et avons depuis sauté quelques places de stationnement. Nous prenons le minimum des deux options.
Si k > n
, c'est-à-dire que nous avons placé plus de places de camion qu'il n'y a de places de stationnement, alors nous mettons ∞
pour l'état (n,k)
. Mais pour les besoins du golf, nous avons mis k
car il s'agit du pire cas de suppression de chaque voiture, et sert également de limite supérieure.
Ce fut une bouchée, alors prenons un exemple, disons:
5 1 3
..##.
Les deux dernières lignes du tableau sont
[0, 1, 2, 1, 2, ∞]
[0, 0, 1, 1, 1, 2]
L'entrée à l'index 2 de l'avant-dernière ligne est 2, car pour atteindre un état de 2//3 = 0
camions pleins placés et étant des 2%3 = 2
espaces le long d'un nouveau camion, c'est la seule option:
TT
..XX
Mais l'entrée à l'index 3 de l'avant-dernière ligne est 1, car pour atteindre un état de 3//3 = 1
camions pleins placés et étant des 3%3 = 0
espaces le long d'un nouveau camion, l'optimal est
TTT
..X#
L'entrée à l'index 3 de la dernière ligne considère les deux cellules ci-dessus comme des options - prenons-nous le cas où nous sommes deux espaces pour un nouveau camion et terminons-le, ou prenons-nous le cas où nous avons un camion plein déjà fini?
TTT TTT
..XX. vs ..X#.
Clairement, ce dernier est meilleur, nous avons donc mis un 1.
Pyth, 70 octets
JmvdczdKw=GUhhJVhJ=HGFTUhN XHhThS>,@GhT+@GTq@KN\#>%hT@J2Z)=GH)@G*@J1eJ
Fondamentalement, un port du code ci-dessus. Pas encore très bien joué au golf. Essayez-le en ligne
Étendu
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]])
Maintenant, si seulement Pyth avait une affectation multiple à> 2 variables ...
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('#')
tant que variable, 2)x=l[i][1];del Q[x:x+L]
,Haskell, 196 caractères
Exécute tous les exemples
Un peu lent: O (2 ^ P) où P est la taille du lot.
Il reste probablement beaucoup de golf ici.
la source