কম্পিউটার টিউটোরিয়াল

C++ দিয়ে সবচেয়ে বড় বিভাজ্য জোড়া সাবসেট (Largest Divisible Pairs Subset) বের করা

একটি সমস্যা সমাধান করতে হবে যেখানে নিরপেক্ষ (distinct) উপাদানlarla একটি অ্যারে দেওয়া আছে। আমাদের এমন একটি সাবসেট বের করতে হবে যাতে সাবসেটের প্রতিটি জোড়া (pair) সমভাগে বিভাজ্য হয়, অর্থাৎ বড় এলিমেন্টটি ছোট এলিমেন্ট দিয়ে বিভাজ্য হয়। উদাহরণ।

ইনপুট: arr[] = {10, 5, 3, 15, 20} আউটপুট: 3 ব্যাখ্যা: সর্বোচ্চ সাবসেট: 10, 5, 20। 10, 5 দিয়ে বিভাজ্য এবং 20, 10 দিয়ে বিভাজ্য।
ইনপুট: arr[] = {18, 1, 3, 6, 13, 17} আউটপুট: 4 ব্যাখ্যা: সর্বোচ্চ সাবসেট: 18, 1, 3, 6। সাবসিকোয়েন্সে 3, 1 দিয়ে বিভাজ্য, 6, 3 দিয়ে বিভাজ্য, 18, 6 দিয়ে বিভাজ্য।

এই সমস্যা সমাধানের জন্য ডাইনামিক প্রোগ্রামিং (Dynamic Programming) প্রয়োগ করব।

সমাধানের পদ্ধতি

এই পদ্ধতিতে, আমরা প্রথমে অ্যারেটি ascending order-এ সর্ট করব। এখন অ্যারেটি শেষ থেকে শুরু করব। একটি dp অ্যারে মেইনটেইন করব যেটি i-তম উপাদান সবচেয়ে ছোট হলে সাবসেটের সাইজ রাখবে। অবশেষে dp অ্যারেতে থেকে সর্বোচ্চ মান রিটার্ন করব।

উদাহরণ
 #include <bits/stdc++.h> using namespace std; int largestSubsetPair(int *a, int n){     int dp[n]; // i-তম ইনডেক্স থেকে শুরু হয়ে সর্বোচ্চ সাবসেট সাইজ     dp[n - 1] = 1; // লাস্ট এলিমেন্ট সবচেয়ে বড়, তার সাবসেট সাইজ ১     int largest = 0; // উত্তর     for (int i = n - 2; i >= 0; i--) {         int maxi = 0;         for (int j = i + 1; j < n; j++)             if (a[j] % a[i] == 0 || a[i] % a[j] == 0)                 maxi = max(maxi, dp[j]); // a[j] a[i] দিয়ে বিভাজ্য হলে             // তার মানে a[j] দিয়ে বিভাজ্য সব এলিমেন্টও মেনে চলবে         dp[i] = 1 + maxi;         largest = max(largest, dp[i]);     }     return largest; } int main(){     int a[] = { 1, 3, 6, 13, 17, 18 }; // দেওয়া অ্যারে     int n = sizeof(a) / sizeof(int); // অ্যারে সাইজ     cout << largestSubsetPair(a, n) << "\n";     return 0; }
আউটপুট
4
কোডের ব্যাখ্যা

এই পদ্ধতিতে, আমরা ডাইনামিক প্রোগ্রামিং দিয়ে সমস্যা সমাধান করেছি। প্রথমে অ্যারে সর্ট করেছি। সর্টেড অ্যারেতে, আমরা dp অ্যারে তৈরি করেছি যেটি আগের সবচেয়ে বড় সাবসেট সাইজ রাখে। এখন অ্যারেতি রিভার্সে (reverse) ট্রাভার্স করি। বর্তমান এলিমেন্টকে মিনিমাম (minimum) ধরে তার 멀্টিপল (multiple) খুঁজি। যেহেতু আমরা রিভার্সে যাচ্ছি, মাল্টিপল আগেই প্রসেস্ড (processed), তাই তাদের সর্বোচ্চ সাবসেট সাইজ dp-তে আছে। বর্তমান এলিমেন্টে সেটি যোগ করি। এভাবেই প্রোগ্রামটি এগিয়ে।

উপসংহার

এই টিউটোরিয়ালে আমরা ডাইনামিক প্রোগ্রামিং দিয়ে সর্বোচ্চ বিভাজ্য জোড়া সাবসেট বের করার সমস্যা সমাধান করেছি। আমরা এই সমস্যার C++ প্রোগ্রাম ও সম্পূর্ণ পদ্ধতি দেখেছি। একই প্রোগ্রাম C, Java, Python ইত্যাদি ভাষায়ও লিখা যায়। আশা করি আপনি এই টিউটোরিয়ালটি সহায়ক পাবেন।

  1. সি++-এ একটি রেখার মিড-পয়েন্ট বের করার প্রোগ্রাম

  2. সি++-এ ত্রিভুজের কেন্ড্রয়েড (Centroid) বের করার প্রোগ্রাম

  3. সি++-এ পেন্টাগনের ক্ষেত্রফল বের করার প্রোগ্রাম

  4. সি++-এ সমান্তরাল চতুর্ভুজের (Parallelogram) ক্ষেত্রফল বের করার প্রোগ্রাম