দুটি সংখ্যা n এবং k দেওয়া আছে। n = খেলার মোট সংখ্যা। সর্বোচ্চ kটি liên tiếp জেতার পথের সংখ্যা বের করতে হবে। উত্তর বড় হলে ১০⁹+৭ মডুলো করুন।
সমস্যা উদাহরণ
ইনপুট: n = 3, k = 2
আউটপুট: 7
ব্যাখ্যা: সম্ভাব্য পথগুলো: LLL, WLL, LWL, LLW, WWL, LWW, WLW (WWW বাদ কারণ ৩টি liên tiếp জয়)।
সমাধানের পদ্ধতি (রিকারসিভ DP + মেমোয়াইজেশন)
m = 10**9 + 7(মডুলো)dp(i, K)ফাংশন: i-তম খেলা থেকে শুরু করে বাকি খেলাগুলো K লিংক জয়সহ সমাপ্ত করার পথ- যদি
i >= n or K > k:K <= kহলে ১, অন্যথায় ০ রিটার্ন করুন return (dp(i+1, 0) + dp(i+1, K+1)) % m(হারলে K=০, জিতলে K+1)
- যদি
dp(0, 0) % mরিটার্ন করুন
পাইথন কোড
def solve(n, k):
m = 10**9 + 7
from functools import lru_cache
@lru_cache(None)
def dp(i, K):
if i >= n or K > k:
return 1 if K <= k else 0
return (dp(i + 1, 0) + dp(i + 1, K + 1)) % m
return dp(0, 0) % m
n = 4
k = 2
print(solve(n, k)) # আউটপুট: 5
টেস্ট কেস
ইনপুট: 4, 2
আউটপুট: 5
নোট: মূল কোডে m = 1**9 + 7 (সদা ৮) লেখা ছিল, সঠিক হচ্ছে 10**9 + 7। রিকারসিভ DP-তে lru_cache যোগ করা হয়েছে পারফরম্যান্সের জন্য।