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]
Một cách tiếp cận DP đơn giản. Một đoạn công bằng của chương trình chỉ là đọc đầu vào.
Giải trình
Chúng tôi tính toán một bảng lập trình động 2D trong đó mỗi hàng tương ứng với các nđiểm đỗ xe đầu tiên và mỗi cột tương ứng với số lượng xe tải (hoặc các bộ phận của xe tải) được đặt cho đến nay. Cụ thể, cột kcó nghĩa là chúng tôi đã đặt k//Lxe tải đầy đủ cho đến nay và chúng tôi đang k%Ltrên đường cho một chiếc xe tải mới. Mỗi ô sau đó là số lượng ô tô tối thiểu để xóa để đạt đến trạng thái (n,k), và trạng thái mục tiêu của chúng tôi là (P, L*T).
Ý tưởng đằng sau sự tái phát của DP là như sau:
- Nếu chúng ta có
k%L > 0không gian cho một chiếc xe tải mới, thì lựa chọn duy nhất của chúng ta là đến từ những k%L-1không gian cho một chiếc xe tải mới
- Mặt khác, nếu
k%L == 0sau đó chúng tôi vừa hoàn thành một chiếc xe tải mới, hoặc chúng tôi đã hoàn thành chiếc xe tải cuối cùng và từ đó đã bỏ qua một vài điểm đỗ xe. Chúng tôi có tối thiểu của hai lựa chọn.
Nếu k > n, tức là chúng ta đã đặt nhiều ô vuông xe tải hơn chỗ đỗ xe, thì chúng ta sẽ đặt ∞trạng thái (n,k). Nhưng với mục đích chơi gôn, chúng tôi đặt ra kvì đây là trường hợp xấu nhất trong việc loại bỏ mọi chiếc xe, và cũng đóng vai trò là giới hạn trên.
Điều này khá là ngon miệng, vì vậy hãy có một ví dụ, nói:
5 1 3
..##.
Hai hàng cuối cùng của bảng là
[0, 1, 2, 1, 2, ∞]
[0, 0, 1, 1, 1, 2]
Mục nhập tại chỉ số 2 của hàng cuối cùng thứ hai là 2, vì để đạt đến trạng thái 2//3 = 0đầy đủ các xe tải được đặt và là 2%3 = 2khoảng trống cho một xe tải mới, đây là lựa chọn duy nhất:
TT
..XX
Nhưng mục nhập ở chỉ số 3 của hàng cuối cùng thứ hai là 1, bởi vì để đạt đến trạng thái 3//3 = 1đầy đủ các xe tải được đặt và là 3%3 = 0khoảng trống cho một xe tải mới, tối ưu là
TTT
..X#
Mục nhập ở chỉ số 3 của hàng cuối cùng xem hai ô ở trên là các tùy chọn - chúng ta có chọn trường hợp chúng ta có 2 khoảng trống cho một chiếc xe tải mới và kết thúc nó không, hoặc chúng ta lấy trường hợp chúng ta có một chiếc xe tải đầy đủ đã xong chưa
TTT TTT
..XX. vs ..X#.
Rõ ràng cái sau tốt hơn, vì vậy chúng tôi đặt xuống 1.
Bình thường, 70 byte
JmvdczdKw=GUhhJVhJ=HGFTUhN XHhThS>,@GhT+@GTq@KN\#>%hT@J2Z)=GH)@G*@J1eJ
Về cơ bản là một cổng của mã trên. Chưa chơi golf tốt lắm. Dùng thử trực tuyến
Mở rộng
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]])
Bây giờ, nếu chỉ Pyth có nhiều phép gán cho> 2 biến ...
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]))