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

সর্বোচ্চ দুটি এলিমেন্ট ইনভার্ট করে সর্বোচ্চ সাবঅ্যারে যোগফল C++-এ

সমস্যা বিবরণ

একটি অ্যারে দেওয়া আছে। অ্যারেতে সর্বোচ্চ দুটি এলিমেন্টের চিহ্ন ইনভার্ট (পজিটিভকে 네가েটিভ ও 네가েটিভকে পজিটিভ) করে সর্বোচ্চ সাবঅ্যারে যোগফল বের করতে হবে।

উদাহরণ

ইনপুট - অ্যারে = {-5, 1, 3, 8, -2, 4, 7}

আউটপুট - 30

ব্যাখ্যা - ইনডেক্স ০ থেকে ৬ পর্যন্ত এলিমেন্ট নেওয়া হয়েছে এবং -5 ও -2-এর চিহ্ন ইনভার্ট করলে সর্বোচ্চ যোগফল ৩০ পাওয়া যায়।

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

ডাইনামিক প্রোগ্রামিং ব্যবহার করে প্রতিটি সাবঅ্যারের আকার ১ থেকে n পর্যন্ত সর্বোচ্চ যোগফল বের করা হয়। প্রতিটি সাবঅ্যারেতে তিনটি কেস বিবেচনা করা হয়:

  • কেস ১: সাবঅ্যারেতে দুটি এলিমেন্ট ইনভার্ট করে সর্বোচ্চ যোগফল।
  • কেস ২: সাবঅ্যারেতে একটি এলিমেন্ট ইনভার্ট করে সর্বোচ্চ যোগফল।
  • কেস ৩: কোনো এলিমেন্ট ইনভার্ট না করে সর্বোচ্চ যোগফল।

এই মানগুলো maxSum নামে ২D অ্যারেতে সংরক্ষণ করা হয় এবং সবচেয়ে বড় মানটি রিটার্ন করা হয়।

C++ কোড উদাহরণ

#include <bits/stdc++.h> 
using namespace std; 

int findMaxSubarraySum(int a[], int n) { 
    int maxSubarraySum = 0; 
    int* arr = new int[n + 1]; 
    for (int i = 1; i <= n; i++) 
        arr[i] = a[i - 1]; 
    int** maxSum = new int*[n + 1]; 
    for (int i = 0; i <= n; i++) 
        maxSum[i] = new int[3]; 
    for (int i = 1; i <= n; ++i) { 
        maxSum[i][0] = max(arr[i], maxSum[i - 1][0] + arr[i]); 
        maxSum[i][1] = max(0, maxSum[i - 1][0]) - arr[i]; 
        if (i >= 2) 
            maxSum[i][1] = max(maxSum[i][1], maxSum[i - 1][1] + arr[i]); 
        if (i >= 2) 
            maxSum[i][2] = maxSum[i - 1][1] - arr[i]; 
        if (i >= 3) 
            maxSum[i][2] = max(maxSum[i][2], maxSum[i - 1][2] + arr[i]); 
        maxSubarraySum = max(maxSubarraySum, maxSum[i][0]); 
        maxSubarraySum = max(maxSubarraySum, maxSum[i][1]); 
        maxSubarraySum = max(maxSubarraySum, maxSum[i][2]); 
    } 
    return maxSubarraySum; 
} 

int main() { 
    int arr[] = {-5, 1, 3, 8, -2, 4, 7}; 
    int n = sizeof(arr) / sizeof(arr[0]); 
    cout << "Maximum subarray sum after inverting at most two elements is " << findMaxSubarraySum(arr, n); 
    return 0; 
}

আউটপুট

Maximum subarray sum after inverting at most two elements is 30
  1. C++-এ দুটি অ্যারেতে ম্যাক্সিমাম সাম পাথ (Maximum Sum Path in Two Arrays)

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

  3. সর্বোচ্চ k সংখ্যক এলিমেন্টের চিহ্ন ফ্লিপ করে সর্বোচ্চ সাবঅ্যারে যোগফল C++-এ

  4. C++-এ সর্বোচ্চ এক উপাদান সরিয়ে সাবঅ্যারে যোগফল সর্বাধিক করা