একটি উচ্চতা h এবং একটি ব্ল্যাকলিস্ট দেওয়া আছে। উচ্চতা h- থেকে ০-এ একটি বল নিচে আনতে হবে। জোড় রাউন্ডে (০ থেকে শুরু) ১, ২, বা ৪ ধাপ নিচে যেতে পারা। বিজোড় রাউন্ডে ১, ৩, বা ৪ ধাপ নিচে যেতে পারা। ব্ল্যাকলিস্টেড লেভেলে পেলে বল মরে যায়। ১০⁹+৭ মডুলো দিয়ে পথের সংখ্যা বের করতে হবে।
সমস্যা উদাহরণ
ইনপুট: h = 5, blacklist = [2, 1]
আউটপুট: 2
ব্যাখ্যা:
- রাউন্ড ০: ১ ধাপ (৫→৪), রাউন্ড ১: ৪ ধাপ (৪→০)
- রাউন্ড ০: ২ ধাপ (৫→৩), রাউন্ড ১: ৩ ধাপ (৩→০)
সমাধানের পদ্ধতি (ডাইনামিক প্রোগ্রামিং)
blacklistকে সেটে রূপান্তর করুন- যদি ০ বা h ব্ল্যাকলিস্টে থাকে তবে ০ রিটার্ন করুন
dpঅ্যারে তৈরি করুন আকার h+1, প্রতিটি উপাদান[0, 0]dp[0] = [1, 1]m = 10**9 + 7- i = 1 থেকে h পর্যন্ত:
- x ∈ {1, 2, 3, 4} এর জন্য যদি
i-x >= 0এবংi-xব্ল্যাকলিস্টে না থাকে:- যদি
x != 3হলেdp[i][0] += dp[i-x][1] - যদি
x != 2হলেdp[i][1] += dp[i-x][0]
- যদি
dp[i][0] %= m,dp[i][1] %= m
- x ∈ {1, 2, 3, 4} এর জন্য যদি
dp[h][0]রিটার্ন করুন
পাইথন কোড
def solve(h, blacklist):
blacklist = set(blacklist)
if 0 in blacklist or h in blacklist:
return 0
dp = [[0, 0] for i in range(h + 1)]
dp[0] = [1, 1]
m = 10 ** 9 + 7
for i in range(1, h + 1):
for x in [1, 2, 3, 4]:
if i - x >= 0 and i - x not in blacklist:
if x != 3:
dp[i][0] += dp[i - x][1]
if x != 2:
dp[i][1] += dp[i - x][0]
dp[i][0] %= m
dp[i][1] %= m
return dp[h][0]
h = 5
blacklist = [2, 1]
print(solve(h, blacklist)) # আউটপুট: 2
টেস্ট কেস
ইনপুট: 5, [2, 1]
আউটপুট: 2