Python 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 ที่ตรงไปตรงมา ชิ้นอันยุติธรรมของโปรแกรมเป็นเพียงการอ่านอินพุต
คำอธิบาย
เราคำนวณตารางการเขียนโปรแกรมแบบไดนามิก 2D ซึ่งแต่ละแถวตรงกับที่nจอดรถจุดแรกและแต่ละคอลัมน์สอดคล้องกับจำนวนรถบรรทุก (หรือบางส่วนของรถบรรทุก) ที่วางไว้ โดยเฉพาะคอลัมน์kหมายความว่าเราได้วางk//Lรถบรรทุกเต็มคันแล้วและเราk%Lไปตามทางเพื่อหารถบรรทุกใหม่ แต่ละเซลล์เป็นแล้วจำนวนน้อยที่สุดของรถยนต์ที่จะล้างไปถึงรัฐและรัฐเป้าหมายของเราคือ(n,k)(P, L*T)
แนวคิดเบื้องหลังการเกิดซ้ำ DP มีดังต่อไปนี้:
- หากเรามีที่
k%L > 0ว่างสำหรับรถบรรทุกคันใหม่ทางเลือกเดียวของเราคือการเป็นk%L-1พื้นที่สำหรับรถบรรทุกใหม่
- ไม่อย่างนั้นถ้า
k%L == 0เราเพิ่งจะทำรถบรรทุกคันใหม่เสร็จหรือเราทำรถคันสุดท้ายเสร็จแล้วและข้ามจุดจอดรถสองสามจุด เราเลือกอย่างน้อยสองตัวเลือก
ถ้าk > nเช่นเราได้วางสี่เหลี่ยมรถบรรทุกมากขึ้นกว่าที่มีจุดจอดรถแล้วเราใส่ของรัฐ∞ (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]))