파이썬 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
주차 지점에 해당하고 각 열이 지금까지 배치 한 트럭 (또는 트럭의 일부)의 수에 해당 하는 2D 동적 프로그래밍 테이블을 계산합니다 . 특히 열 k
은 k//L
지금까지 전체 트럭을 배치 k%L
했으며 새 트럭을 찾는 단계라는 의미입니다. 그런 다음 각 셀은 주에 도달 할 수있는 최소 차량 수이며 (n,k)
목표 상태는 (P, L*T)
입니다.
DP 재발의 기본 개념은 다음과 같습니다.
- 우리가
k%L > 0
새로운 트럭을위한 공간 이라면 , 우리의 유일한 선택은 k%L-1
새로운 트럭을위한 공간 이되는 것 입니다.
- 그렇지 않으면
k%L == 0
우리가 방금 새 트럭을 완성했거나 이미 마지막 트럭을 완성한 후 몇 개의 주차 지점을 건너 뛰었습니다. 우리는 두 가지 옵션 중 최소한을 취합니다.
k > n
즉, 주차 지점보다 더 많은 트럭 광장을 배치 한 경우 ∞
state로 설정 (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]))