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

সর্বোচ্চ যোগফল বारी-बারি সাবসিকোয়েন্স (C++ প্রোগ্রাম)

এই সমস্যাতে, আমাদের n সংখ্যক পূর্ণসংখ্যা সহ একটি অ্যারে arr[] দেওয়া আছে। আমাদের কাজ হল অ্যারেটির প্রথম উপাদান থেকে শুরু করে সর্বোচ্চ যোগফল বारी-बারি সাবসিকোয়েন্স খুঁজে বের করার প্রোগ্রাম তৈরি করা।

একটি বاري-बারি সাবসিকোয়েন্স হল এমন একটি সাবসিকোয়েন্স যেখানে উপাদানগুলো বাড়ছে এবং কমছে বारी-बারি করে, অর্থাৎ প্রথম কমবে, তারপর বাড়বে, তারপর আবার কমবে। এখানে, বিপরীত বاري-बারি সাবসিকোয়েন্স সর্বোচ্চ যোগফল বের করার জন্য বৈধ নয়।

উদাহরণ ইনপুট
arr[] = {5, 1, 6, 2, 4, 8, 9}
আউটপুট
27
ব্যাখ্যা
শুরুর উপাদান: 5, কমে: 1, বাড়ে: 6, কমে: 2, বাড়ে: 4, N.A. এখানে, আমরা 4, 8, 9 কে সাবসিকোয়েন্সের শেষ উপাদান হিসেবে ব্যবহার করতে পারি।
যোগফল = 5 + 1 + 6 + 2 + 4 + 9 = 27
সমাধানের পদ্ধতি

সমস্যা সমাধানের জন্য, আমরা ডাইনামিক প্রোগ্রামিং পদ্ধতি ব্যবহার করব। এর জন্য, আমরা দুটি অ্যারে ব্যবহার করব - একটি arr[i] দিয়ে শেষ হওয়া উপাদানগুলোর সর্বোচ্চ যোগফল সংরক্ষণ করতে, যেখানে arr[i] বাড়ছে। অন্যটি arr[i] দিয়ে শেষ হওয়া উপাদানগুলোর সর্বোচ্চ যোগফল সংরক্ষণ করতে, যেখানে arr[i] কমছে।

তারপর আমরা এক-এক করে উপাদান যোগ করব বারি-बারি সাবসিকোয়েন্স কিনা চেক করে। প্রতিটি অ্যারেতে, আমরা ইনডেক্স পর্যন্ত সর্বোচ্চ যোগফল হিসাব করব। এবং n সংখ্যক উপাদান ট্রভার্স করার পর সর্বোচ্চ মান ফেরত দিব।

C++ প্রোগ্রাম উদাহরণ
#include 
#include 
using namespace std;

int maxVal(int x, int y) {
    if (x > y)
        return x;
    return y;
}

int calcMaxSumAltSubSeq(int arr[], int n) {
    int maxSum = -10000;
    int maxSumDec[n];
    bool isInc = false;
    memset(maxSumDec, 0, sizeof(maxSumDec));
    int maxSumInc[n];
    memset(maxSumInc, 0, sizeof(maxSumInc));
    maxSumDec[0] = maxSumInc[0] = arr[0];
    
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < i; j++) {
            if (arr[j] > arr[i]) {
                maxSumDec[i] = maxVal(maxSumDec[i], maxSumInc[j] + arr[i]);
                isInc = true;
            } else if (arr[j] < arr[i] && isInc)
                maxSumInc[i] = maxVal(maxSumInc[i], maxSumDec[j] + arr[i]);
        }
    }
    
    for (int i = 0; i < n; i++)
        maxSum = maxVal(maxSum, maxVal(maxSumInc[i], maxSumDec[i]));
    
    return maxSum;
}

int main() {
    int arr[] = {8, 2, 3, 5, 7, 9, 10};
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << "The maximum sum alternating subsequence starting is " << calcMaxSumAltSubSeq(arr, n);
    return 0;
}
আউটপুট
The maximum sum alternating subsequence starting is 25
  1. সার্কুলার সাবঅ্যারে সর্বোচ্চ সমষ্টি C++-এ

  2. C++-এ অ্যারেতে সর্বোচ্চ ট্রিপলেট যোগফল (Maximum Triplet Sum in Array)

  3. C++-এ ম্যাক্সিমাম সাবঅ্যারে সাম মডুলো m

  4. C++-এ অ্যারেতে সর্বোচ্চ ইকুইলিব্রিয়াম যোগফল