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

সি++-এ কমপক্ষে k দূরত্বে থাকা উপাদান দিয়ে সর্বোচ্চ সাবসিকোয়েন্স যোগফল


সমস্যা বিবরণ

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

উদাহরণ: arr = {2,3,7,9,2,8,3}, k=2 → আউটপুট 15 (সাবসিকোয়েন্স: {7,8})।

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

ডাইনামিক প্রোগ্রামিং:

  1. maxSumDP[i] = ইনডেক্স i থেকে শেষ পর্যন্ত শর্ত পূরণকারী সাবসিকোয়েন্সের সর্বোচ্চ যোগফল।
  2. বেস: maxSumDP[n-1] = arr[n-1]।
  3. ট্রানজিশন:
    • যদি i + k + 1 >= n: maxSumDP[i] = max(arr[i], maxSumDP[i+1])
    • অন্যথায়: maxSumDP[i] = max(arr[i] + maxSumDP[i+k+1], maxSumDP[i+1])
  4. i = n-2 থেকে 0 পর্যন্ত পূরণ করুন।
  5. maxSumDP[0] রিটার্ন করুন।

উদাহরণ কোড

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

int calcMaxSubSeqSum(int arr[], int N, int k) {
    int maxSumDP[N];
    maxSumDP[N-1] = arr[N-1];
    for (int i = N-2; i >= 0; i--) {
        if (i + k + 1 >= N)
            maxSumDP[i] = max(arr[i], maxSumDP[i+1]);
        else
            maxSumDP[i] = max(arr[i] + maxSumDP[i+k+1], maxSumDP[i+1]);
    }
    return maxSumDP[0];
}

int main() {
    int N = 10, k = 2;
    int arr[] = {50, 70, 40, 50, 90, 70, 60, 40, 70, 50};
    cout << "The maximum sum subsequence with at-least k distant elements is " << calcMaxSubSeqSum(arr, N, k);
    return 0;
}

আউটপুট

The maximum sum subsequence with at-least k distant elements is 230
  1. সি++-এ পারমিউটেশনে সন্নিহিত উপাদানগুলোর পার্থক্যের সর্বোচ্চ যোগফল

  2. সি++-এ সর্বোচ্চ যোগফল ওর্ডার্ড সাবসিকোয়েন্স | DP-14

  3. C++-এ সর্বোচ্চ যোগফল নিম্নমুখী সাবসিকোয়েন্স (Maximum Sum Decreasing Subsequence)

  4. C++-এ সর্বোচ্চ যোগফল বীজোড় সাবসিকোয়েন্স (Maximum Sum Alternating Subsequence)