এই সমস্যায়, আমাদেরকে তিনটি অ্যারে দেওয়া হয়েছে arr1[], arr2[], এবং arr3[] সমস্ত N আকারের। আমাদের কাজ হল তিনটি অ্যারে থেকে সর্বোচ্চ যোগফল বের করার জন্য একটি প্রোগ্রাম তৈরি করা যাতে একই থেকে ধারাবাহিকভাবে উপাদান বাছাই করা হয় না। C++ এ অনুমোদিত।
সমস্যা বর্ণনা
আমরা N উপাদান নির্বাচন করে সর্বাধিক যোগফল খুঁজে বের করব। i=th উপাদানটি অ্যারের i-th উপাদান থেকে যোগফল নির্বাচন করা যেতে পারে অর্থাৎ ith যোগফল arr1[i]/ arr2[i]/ arr3[i] থেকে। এছাড়াও, মনে রাখবেন যে আমরা একই অ্যারে থেকে বেছে নেওয়া যেতে পারে এমন দুটি পরপর উপাদান নির্বাচন করতে পারি না।
সমস্যাটি বোঝার জন্য একটি উদাহরণ নেওয়া যাক,
ইনআউট
arr1[] = {5, 8, 9, 20},
arr2[] = {7, 12, 1, 10},
arr3[] = {8, 9, 10, 11}
N = 4 আউটপুট
50
ব্যাখ্যা
i =1 এর জন্য, আমরা arr3 থেকে যোগফলের জন্য 8 বিবেচনা করব। i =2 এর জন্য, আমরা arr2 থেকে যোগফলের জন্য 12 বিবেচনা করব। i =3 এর জন্য, আমরা arr3 থেকে যোগফলের জন্য 10 বিবেচনা করব। i =4 এর জন্য, আমরা arr1 থেকে যোগফলের জন্য 20 বিবেচনা করব। যোগফল =8 + 12 + 10 + 20 =50
সমাধান পদ্ধতি
সমস্যা সমাধানের জন্য, আমরা গতিশীল প্রোগ্রামিং পদ্ধতি ব্যবহার করব, অতিরিক্ত গণনা এড়াতে আমাদের সূচক পর্যন্ত যোগফল মুখস্ত করতে হবে। আমরা একটি 2-ডি ম্যাট্রিক্স তৈরি করব, DP[][]। সূচী i,j-এ উপাদানটি হবে i-th সূচক এবং j-th অ্যারে ব্যবহার করা পর্যন্ত উপাদানগুলির সমষ্টি। আমরা পুনরাবৃত্তভাবে বর্তমানের জন্য উপাদানগুলি খুঁজে বের করব এবং তারপরে অন্য দুটি অ্যারে থেকে পরবর্তী উপাদানগুলির যোগফলকে কল করব৷
উদাহরণ
আমাদের সমাধানের কাজ চিত্রিত করার জন্য প্রোগ্রাম,
#include <bits/stdc++.h>
using namespace std;
const int N = 3;
int findMaxVal(int a, int b){
if(a > b)
return a;
return b;
}
int FindMaximumSum(int index, int arrNo, int arr1[], int arr2[], int arr3[], int n, int DP[][N]){
if (index == n)
return 0;
if (DP[index][arrNo] != -1)
return DP[index][arrNo];
int maxVal = -1;
if (arrNo == 0){
maxVal = findMaxVal(maxVal, arr2[index] + FindMaximumSum(index + 1, 1, arr1, arr2, arr3, n, DP));
maxVal = findMaxVal(maxVal, arr3[index] + FindMaximumSum(index + 1, 2, arr1, arr2, arr3, n, DP));
}
else if (arrNo == 1){
maxVal = findMaxVal(maxVal, arr1[index] + FindMaximumSum(index + 1, 0, arr1, arr2, arr3, n, DP));
maxVal = findMaxVal(maxVal, arr3[index] + FindMaximumSum(index + 1, 2, arr1, arr2, arr3, n, DP));
}
else if (arrNo == 2){
maxVal = findMaxVal(maxVal, arr1[index] + FindMaximumSum(index + 1, 1, arr1, arr2, arr3, n, DP));
maxVal = findMaxVal(maxVal, arr2[index] + FindMaximumSum(index + 1, 0, arr1, arr2, arr3, n, DP));
}
return DP[index][arrNo] = maxVal;
}
int main(){
int arr1[] = { 5, 8, 9, 20 };
int arr2[] = { 7, 12, 1, 10 };
int arr3[] = { 8, 9, 10, 11 };
int n = sizeof(arr1) / sizeof(arr1[0]);
int DP[n][N];
memset(DP, -1, sizeof DP);
int val1 = FindMaximumSum(0, 0, arr1, arr2, arr3, n, DP);
int val2 = FindMaximumSum(0, 1, arr1, arr2, arr3, n, DP);
int val3 = FindMaximumSum(0, 2, arr1, arr2, arr3, n, DP);
cout<<"The maximum sum from three arrays such that picking elements consecutively from same is not allowed is "<<findMaxVal(val1, findMaxVal(val2, val3));
return 0;
} আউটপুট
The maximum sum from three arrays such that picking elements consecutively from same is not allowed is 50