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

C++-এ K-সংযোগ সর্বোচ্চ উপ-অ্যারে যোগফল


একটি পূর্ণসংখ্যা অ্যারে arr আর একটি পূর্ণসংখ্যা k দেওয়া আছে। অ্যারেটিকে k বার রিপিট করে পরিবর্তিত অ্যারে বানাতে হবে। যেমন, arr = [1, 2], k = 3 হলে পরিবর্তিত অ্যারে: [1, 2, 1, 2, 1, 2]। এখন এই পরিবর্তিত অ্যারেতে সর্বোচ্চ উপ-অ্যারে যোগফল বের করতে হবে। উপ-অ্যারের দৈর্ঘ্য ০ হতে পারে (সেক্ষেত্রে যোগফল ০)। ফলাফল বড় হতে পারে, তাই 10^9 + 7 দিয়ে মডুলো নিয়ে ফেরত দিন। উদাহরণ: [1,-2,1], k = 5 হলে ফলাফল ২।

সমাধানের ধাপগুলো:

  • getKadane() মেথড বানান যা অ্যারে নেবে:
    • ret := -inf, sum := 0 (সব মড 10^9+7)
    • i = 0 থেকে arr.size()-1 পর্যন্ত:
      • sum := max(arr[i], arr[i] + sum)
      • ret := max(ret, sum)
    • ret < 0 হলে ০ ফেরত দিন, অন্যথায় ret।
  • getSum() মেথড: অ্যারেটির সব উপাদানের যোগফল (মড 10^9+7)।
  • getPrefix() মেথড: প্রিফিক্স সর্বোচ্চ যোগফল (মড 10^9+7)।
  • getSuffix() মেথড: সাফিক্স সর্বোচ্চ যোগফল (মড 10^9+7)।
  • মূল মেথড:
    • kadane := getKadane(arr), sum := getSum(arr), prefix := getPrefix(arr), suffix := getSuffix(arr)
    • যদি k == 1, kadane ফেরত দিন।
    • যদি sum > 0, max((sum * (k-2)) + prefix + suffix, kadane) ফেরত দিন।
    • অন্যথায় max(prefix + suffix, kadane) ফেরত দিন।

উদাহরণ (C++)

#include <bits/stdc++.h> using namespace std; typedef long long int lli; const int MOD = 1e9 + 7; int add(lli a, lli b){    return ((a % MOD) + (b % MOD)) % MOD; } int mul(lli a, lli b){    return ((a % MOD) * (b % MOD)) % MOD; } class Solution {    public:    int getKadane(vector <int>& arr){       int ret = INT_MIN;       int sum = 0;       for(int i = 0; i < arr.size(); i++){          sum = max(arr[i], arr[i] + sum);          ret = max(ret, sum);          sum %= MOD;          ret %= MOD;       }       return ret < 0? 0 : ret;    }    int getSum(vector <int>& arr){       int ret = 0;       for(int i = 0; i < arr.size(); i++){          ret += arr[i];          ret %= MOD;       }       return ret;    }    int getPrefix(vector <int>& arr){       int ret = INT_MIN;       int sum = 0;       for(int i = 0; i <arr.size(); i++){          sum += arr[i];          sum %= MOD;          ret = max(ret, sum);          ret %= MOD;       }       return ret < 0 ? 0 : ret;    }    int getSuffix(vector <int>& arr){       int sum = 0;       int ret = INT_MIN;       for(int i = arr.size() - 1; i >= 0 ; i--){          sum += arr[i];          ret = max(ret, sum);          sum %= MOD;          ret %= MOD;       }       return ret < 0 ? 0 : ret;    }    int kConcatenationMaxSum(vector<int>& arr, int k) {       int kadane = getKadane(arr);       int sum = getSum(arr);       int prefix = getPrefix(arr);       int suffix = getSuffix(arr);       if(k == 1) return kadane;       if(sum > 0){          return max((int)mul((k-2) , sum) + prefix % MOD + suffix % MOD, kadane);       } else {          return max(add(prefix , suffix), kadane);       }    } }; main(){    vector<int> v1 = {1,-2,1};    Solution ob;    cout << (ob.kConcatenationMaxSum(v1, 5)); }

ইনপুট

[1,-2,1] 5

আউটপুট

2

  1. C++-এ বাইনারি ট্রিতে সর্বোচ্চ স্পাইরাল যোগফল

  2. C++-এ ত্রিভুজে সর্বোচ্চ পথ যোগফল

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

  4. C++-এ অ্যারেয়ের সর্বোচ্চ গড় যোগফল পার্টিশন