কম্পিউটার

C++ এ বিভক্ত অ্যারে বৃহত্তম যোগফল


ধরুন আমাদের কাছে ধনাত্মক পূর্ণসংখ্যার একটি অ্যারে এবং একটি মান m আছে। আমরা এই অ্যারেটিকে m সংখ্যায় সংলগ্ন সাব্যারেতে ভাগ করতে পারি। এই m সাব্যারেগুলির মধ্যে সবচেয়ে বড় যোগফল কমানোর জন্য আমাদের একটি অ্যালগরিদম তৈরি করতে হবে৷

সুতরাং যদি অ্যারে বলা হয় [7,2,4,10,9], এবং m =2, তাহলে যোগফল হবে 19, যেহেতু আমরা [7,2,4] এবং [10,9] এর মতো দুটি সাবয়ারে তৈরি করতে পারি। , তারপর সবচেয়ে বড় যোগফল সহ সাব্যারে হল 19।

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • একটি ফাংশন splitArray() সংজ্ঞায়িত করুন, এটি একটি অ্যারে নিয়ে যাবে v, m,
  • n :=v এর আকার
  • একটি অ্যারে ডিপি আকারের তৈরি করুন
  • অন্য একটি অ্যারের যোগফল n আকারের করুন
  • সমষ্টি[0] :=v[0]
  • আরম্ভ করার জন্য i :=1, যখন i করুন
  • সমষ্টি[i] :=যোগফল[i - 1] + v[i]
  • dp[0] :=যোগফল[n - 1]
  • আরম্ভ করার জন্য i :=1, যখন i করুন
  • dp[i] :=যোগফল[n - 1] - যোগফল[i - 1]
  • আরম্ভ করার জন্য i :=1, যখন i করুন
  • শুরু করার জন্য :=0, যখন শুরু হয় করুন
  • শেষ শুরু করার জন্য :=শুরু + 1, যখন শেষ হয় <=n - i, আপডেট (শেষ 1 দ্বারা বৃদ্ধি করুন), করুন −
  • dp[start] :=dp[start] এর সর্বনিম্ন এবং সর্বাধিক (sum[end - 1] যখন শুরু 0 হয়, অন্যথায় যোগফল[end - 1] - sum[start - 1]) এবং dp[শেষ]
  • রিটার্ন ডিপি[0]
  • আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

    উদাহরণ

    #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];
       }
    };
    main(){
       Solution ob;
       vector<int> v = {7,2,4,10,9};
       cout << (ob.splitArray(v, 2));
    }

    ইনপুট

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

    আউটপুট

    19

    1. অ্যারেতে সবচেয়ে বড় ডি খুঁজুন যেমন সি++ এ a + b + c =d

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

    3. C++ সাম অ্যারে ধাঁধা

    4. C++ এ একটি সমষ্টি অ্যারে ধাঁধা?