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

C++-এ স্প্লিট অ্যারের সর্বোচ্চ যোগফল ন্যূনতম করা

স্প্লিট অ্যারে লার্জেস্ট সাম সমস্যা

একটি ধনাত্মক পূর্ণসংখ্যার অ্যারে এবং একটি মান m দেওয়া আছে। অ্যারেটিকে mটি সংলগ্ন সাবঅ্যারে-এ ভাগ করতে হবে। লক্ষ্য হলো এই mটি সাবঅ্যারেতে যেটির যোগফল সর্বোচ্চ, সেই সর্বোচ্চ যোগফলকে ন্যূনতম করা।

উদাহরণ: [7,2,4,10,9] এবং m = 2 হলে, সাবঅ্যারে [7,2,4] (যোগফল ১৩) এবং [10,9] (যোগফল ১৯)। সর্বোচ্চ যোগফল ১৯, যা ন্যূনতম সম্ভব।

সমাধানের পদ্ধতি (ডাইনামিক প্রোগ্রামিং)

  • n := v.size()
  • প্রিফিক্স যোগফল অ্যারে sum তৈরি করুন
  • DP টেবিল dp[i] = সূচক i থেকে শেষ পর্যন্ত বাকি অংশকে kটি সাবঅ্যারে-এ ভাগ করলে ন্যূনতম সম্ভব সর্বোচ্চ যোগফল
  • প্রথমে k=1 এর জন্য dp ইনিশিয়ালাইজ করুন
  • k = 2 থেকে m পর্যন্ত আপডেট করুন:
    • dp[start] = min(dp[start], max(sum(end-1) - sum(start-1), dp[end]))
  • dp[0] ফেরত দিন

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

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;

class Solution {
public:
    int splitArray(vector<int>& v, int m) {
        int n = v.size();
        vector<long long int> dp(n);
        vector<long long int> sum(n);
        sum[0] = v[0];
        for(int i = 1; i < n; i++) sum[i] = sum[i-1] + v[i];
        dp[0] = sum[n-1];
        for(int i = 1; i < n; i++) {
            dp[i] = sum[n-1] - sum[i-1];
        }
        for(int i = 1; i < m; i++) {
            for(int start = 0; start < n-i; start++) {
                for(int end = start+1; end <= n-i; end++) {
                    dp[start] = min(dp[start], max((start==0?sum[end-1]:sum[end-1]-sum[start-1]), dp[end]));
                }
            }
        }
        return dp[0];
    }
};

int main() {
    Solution ob;
    vector<int> v = {7,2,4,10,9};
    cout << (ob.splitArray(v, 2));
    return 0;
}

ইনপুট

[7,2,4,10,9] 2

আউটপুট

19
  1. অ্যারেতে a+b+c=d হওয়া সর্বোচ্চ d বের করা (C++)

  2. C++ STL-এ অ্যারে যোগফল (Array Sum)

  3. C++ সম অ্যারে পাজল (Sum Array Puzzle)

  4. C++-এ সম অ্যারে পাজল (Sum Array Puzzle) সমাধান