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駐車スポットに対応し、各列がこれまでに配置されたトラック(またはトラックのパーツ)の数に対応する2D動的プログラミングテーブルを計算します。特に、列とkは、これまでにk//Lフルトラックを配置k%Lし、新しいトラックを探していることを意味します。各セルは、状態に到達するためにクリアする車の最小数で(n,k)あり、目標の状態は(P, L*T)です。
DP再発の背後にある考え方は次のとおりです。
- 私たちが
k%L > 0新しいトラックのためのスペースである場合、私たちの唯一の選択肢はk%L-1、新しいトラックのためのスペースであることから来ることです
- それ以外の場合
k%L == 0は、新しいトラックを完成したばかりか、すでに最後のトラックを完成していて、それ以降いくつかの駐車場をスキップした場合です。2つのオプションのうち最小のものを使用します。
k > nつまり、駐車場の数よりも多くのトラック広場を配置した場合は、∞州に配置します(n,k)。ただしk、これはすべての車を削除する最悪のケースであり、上限としても機能するため、ゴルフの目的で使用します。
これは一口だったので、例を挙げてみましょう。
5 1 3
..##.
テーブルの最後の2行は
[0, 1, 2, 1, 2, ∞]
[0, 0, 1, 1, 1, 2]
最後から2番目の行のインデックス2のエントリは2です。これは、2//3 = 0満杯のトラックが配置さ2%3 = 2れ、新しいトラック用のスペースになっている状態に到達するため、これが唯一のオプションです。
TT
..XX
ただし、最後の2行目のインデックス3のエントリは1 です。新しいトラックを3//3 = 1配置するために満員のトラックが配置され、3%3 = 0そこにスペースがある状態に到達するには、最適なのは
TTT
..X#
最後の行のインデックス3のエントリは、上記の2つのセルをオプションとして表示します—新しいトラック用に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]))