Light OJ - 1005 - Rooks Tutorial(DP)

Problem Description here

প্রব্লেমটিতে বলা হয়েছে, একটা n*n গ্রীড দেয়া থাকবে। সেখানে k সংখ্যক রুক বসাতে হবে যাতে তারা একে অন্যকে এটাক করতে না পারে। আমরা জানি, গ্রীডের যেকোন সেল রিপ্রেজেন্ট করতে দুইটা ভ্যালু লাগে। একটা সারি নং , অন্যটা কলাম নং। একটা রুক অন্য রুককে তখনই এটাক করে যখন অন্য রুক এর সাথে তার সারি নং অথবা কলাম নং মিলে যায়।


সল্যুশন আইডিয়াঃ 

আমাকে এমনভাবে, k সংখ্যক রুক বসাতে হবে যাতে একই সারিতে দুইটা রুক বসতে না পারে এবং একই কলামে দুইটা রুক বসতে না পারে। 

ডিপি'র স্টেট নিবো দুইটা। 
স্টেট-১ঃ এখন আমি কত তম সারি তে আছি।
স্টেট-২ঃ কয়টা রুক বসানো এখনো বাকি আছে।

প্রতিটি অবস্থানে আমার সর্বোচ্চ দুই ধরনের অবস্থা দাঁড়াতে পারে।

১) আমি ভিজিট করি নি এমন সারির সংখ্যা যদি বাকি থাকা রুকের সংখ্যা থেকে বেশি হয়, তবে আমি বর্তমান সারি ব্যাবহার করতেও পারি। নাও করতে পারি। 
২) আমি যদি বর্তমান সারি ব্যাবহার করি, তাহলে এই সারি থেকে আমাকে একটি কলাম বাছাই করে নিতে হবে। সোজা কথায় এই সারির একটা সেল বাছাই করতে হবে। যেহেতু, বর্তমানে অব্যাবহৃত রুকের সংখ্যা আমার জানা, তাই কয়টি কলাম এখনো ব্যাবহারযোগ্য সেটাও আমি বের করতে পারি। (ব্যাবহারযোগ্য কলাম এজন্য বলছি কারণ একই কলাম তো একাধিকবার ব্যাবহার করা যাবে না) 

এখন, ব্যাবহারযোগ্য কলামগুলো থেকে একটি কলাম কতভাবে বাছাই করা যায়? সেই সংখ্যার সাথে গুণ হবে পরবর্তী স্টেট থেকে যেসব ভ্যালু পাবো। 

সবশেষে, উপরের দুইটি অবস্থায় প্রাপ্তভ্যালুদ্বয় যোগ করলেই আমি পেয়ে যাবো রুক বসানোর মোট উপায়।

Happy Coding -_-

Comments

Trending Post

Shortest distance between two point in a grid when you can move all 8 sides from a position

DP Optimization(Part-4) | Longest Increasing Subsequence | DP Series(Episode-18)