পাইথন 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]
একটি সোজা ডিপি পদ্ধতির। প্রোগ্রামটির ন্যায্য অংশটি কেবল ইনপুট পড়া reading
ব্যাখ্যা
আমরা একটি 2 ডি গতিশীল প্রোগ্রামিং টেবিল গণনা করি যেখানে প্রতিটি সারিটি প্রথম n
পার্কিং স্পটগুলির সাথে মিলে যায় এবং প্রতিটি কলাম এ পর্যন্ত রাখা ট্রাকের সংখ্যার (বা কোনও ট্রাকের অংশ) সাথে সামঞ্জস্য করে। বিশেষত, কলামটির k
অর্থ আমরা k//L
এখনও অবধি পুরো ট্রাক রেখেছি এবং আমরা k%L
একটি নতুন ট্রাকের পথে রয়েছি। প্রতিটি সেল তারপর গাড়ির ন্যূনতম সংখ্যা পরিস্থিতিতে পৌছনোর পরিষ্কার হয় (n,k)
, এবং আমাদের লক্ষ্য রাষ্ট্র (P, L*T)
।
ডিপি পুনরুক্তির পিছনে ধারণাটি নিম্নলিখিত:
- যদি আমরা
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 রেখেছি।
পাইথ, 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]])
এখন, যদি পাইথের কাছে> 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]))