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方法。该程序的相当一部分只是读取输入。
说明
我们计算一个二维动态规划表,其中每一行对应于第一个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]))