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

C++-এ রস्सি কাটিয়ে সর্বোচ্চ গুণফল বের করার প্রোগ্রাম (Maximum Product Cutting | DP-36)


সমস্যা বিবরণ

N মিটার লম্বা একটি রস്സি দেওয়া থাকলে, এটিকে পূর্ণসংখ্যা দৈর্ঘ্যের টুকরোতে কাটতে হবে যাতে টুকরোগুলোর গুণফল সর্বোচ্চ হয়। কমপক্ষে এক কাট করতে হবে।

সমাধানের পদ্ধতি (Recursive DP)

  1. বেস কেস: n=0 বা 1 → 0 (কাট করা যায় না)।
  2. প্রতিটি i = 1 থেকে n-1 এর জন্য:
    • অপশন ১: i এবং (n-i) দুটো টুকরো → গুণফল = i × (n-i)
    • অপশন ২: i এবং (n-i)-কে আরও কাটা → গুণফল = i × maxProd(n-i)
  3. সর্বোচ্চ মান রিটার্ন করুন।

নোট: এটি রিকার্সিভ এবং এক্সপোনেনশিয়াল সময় নেয়। DP মেমোইজেশন বা বটম-আপ দিয়ে O(n²) করা যায়। গাণিতিকভাবে, ৩ দিয়ে ভাগ করলে সর্বোচ্চ গুণফল পাওয়া যায় (Integer Break problem)।

C++ কোড উদাহরণ (রিকার্সিভ)

#include <iostream>
using namespace std;

int max(int a, int b) { return (a > b) ? a : b; }
int max(int a, int b, int c) { return max(a, max(b, c)); }

int maxProd(int n) {
    if (n == 0 || n == 1) return 0;
    int max_val = 0;
    for (int i = 1; i < n; i++)
        max_val = max(max_val, i * (n - i), maxProd(n - i) * i);
    return max_val;
}

int main() {
    cout << "Maximum Product is " << maxProd(10);
    return 0;
}

আউটপুট

Maximum Product is 36

ব্যাখ্যা

10 = 3 + 3 + 4 → গুণফল = 3 × 3 × 4 = 36

জটিলতা

  • রিকার্সিভ: O(2ⁿ)
  • DP (মেমোইজেশন): O(n²)
  • গাণিতিক (O(1)): ৩ দিয়ে ভাগ করুন, বাকি ১ হলে ৪×৪, বাকি ২ হলে ৩×৩×২
  1. C++-এ ট্রিতে দুটি অ-অন্তঃচ্ছেদী পথের সর্বোচ্চ গুণফল (Maximum product of two non-intersecting paths in a tree)

  2. C++-এ শব্দ দৈর্ঘ্যের সর্বোচ্চ গুণফল

  3. C++-এ অ্যারেতে সর্বোচ্চ গুণফল দায়ক কোয়াড্রুপল (Quadruple) নির্ণয়

  4. C++-এ LCM যা গুণফলের সমান হয় এমন সর্বোচ্চ দৈর্ঘ্যের সাবঅ্যারে