এই সমস্যায়, আমাদেরকে N পূর্ণসংখ্যার একটি অ্যারে [] এবং দুটি সূচক মান x এবং y দেওয়া হয়েছে। আমাদের কাজ হল একটি উপসর্গ থেকে সর্বাধিক যোগফল বৃদ্ধির অনুগামী খুঁজে বের করার জন্য একটি প্রোগ্রাম তৈরি করা এবং উপসর্গের পরে একটি প্রদত্ত উপাদান C++ এ আবশ্যক।
সমস্যা বর্ণনা
আমরা ইনডেক্স x পর্যন্ত ক্রমবর্ধমান সর্বাধিক যোগফল খুঁজে পাব এবং y সূচকের উপাদান সহ।
সমস্যাটি বোঝার জন্য একটি উদাহরণ নেওয়া যাক,
ইনপুট
arr[] = {1, 5, 9, 131, 6, 100, 11, 215}, x = 4, y = 6 আউটপুট
26
ব্যাখ্যা
আমরা সূচী 3 পর্যন্ত পরবর্তী অংশ নেব এবং তারপরে শেষ পর্যন্ত arr[6] =11 অন্তর্ভুক্ত করব।
পরেরটি হল {1, 5, 9, 11}। যোগফল =1+5+9+11 =26
সমাধান পদ্ধতি
একটি সহজ পদ্ধতি হল x সূচক পর্যন্ত একটি নতুন অ্যারে তৈরি করা এবং তারপর শেষে y সূচীতে উপাদান যোগ করা। তারপরে সমস্ত ক্রমবর্ধমান অনুক্রমগুলি গণনা করুন এবং তারপরে arr[y] উপাদানটি অন্তর্ভুক্ত করতে পারে না এমন সমস্তগুলি বর্জন করুন এবং maxSum খুঁজুন৷
সমস্যা সমাধানের জন্য আরও একটি কার্যকর পদ্ধতি হল একটি গতিশীল প্রোগ্রামিং পদ্ধতি ব্যবহার করা। ধারণাটি হল একটি 2-ডি অ্যারে ডিপি [][] তৈরি করা, এবং সর্বাধিক ক্রমবর্ধমান অনুক্রমের সমষ্টি সংরক্ষণ করা। DP[x][y]-এ থাকা মানটি arr[y] উপাদান সহ সূচক x পর্যন্ত সর্বাধিক যোগফল দেবে।
উদাহরণ
আমাদের সমাধানের কাজ চিত্রিত করার জন্য প্রোগ্রাম,
#include <iostream>
using namespace std;
int DP[100][100];
void preCalcMaxSum(int arr[], int N){
for (int i = 0; i < N; i++) {
if (arr[i] > arr[0])
DP[0][i] = arr[i] + arr[0];
else
DP[0][i] = arr[i];
}
for (int i = 1; i < N; i++) {
for (int j = 0; j < N; j++) {
if (arr[j] > arr[i] && j > i) {
if (DP[i - 1][i] + arr[j] > DP[i - 1][j])
DP[i][j] = DP[i - 1][i] + arr[j];
else
DP[i][j] = DP[i - 1][j];
}
else
DP[i][j] = DP[i - 1][j];
}
}
}
int main() {
int arr[] = {1, 5, 9, 131, 6, 100, 11, 215};
int N = sizeof(arr) / sizeof(arr[0]);
int x = 4, y = 6;
preCalcMaxSum(arr, N);
cout<<"The maximum sum increasing subsequence from a prefix and a given element after prefix is must is ";
cout<<DP[x][y];
return 0;
} আউটপুট
The maximum sum increasing subsequence from a prefix and a given element after prefix is must is 26
একটি দক্ষ পদ্ধতি সূচক x পর্যন্ত ক্রমবর্ধমান অনুক্রমের সর্বাধিক যোগফল খুঁজে বের করতে এমনভাবে ব্যবহার করছে যাতে অনুক্রমের বৃহত্তম উপাদানটি সূচক y-এর উপাদানের চেয়ে কম হয়। এর জন্য আমরা আবার ডায়নামিক প্রোগ্রামিং পদ্ধতি ব্যবহার করব।
উদাহরণ
আমাদের সমাধানের কাজ চিত্রিত করার জন্য প্রোগ্রাম,
#include <iostream>
using namespace std;
int calcMaxSum(int arr[], int n, int x, int y){
int DP[x] = {0};
int maxSum = -1;
for (int i = 0; i <= x; i++)
DP[i] = arr[i];
for (int i = 0; i <= x; i++) {
if (arr[i] >= arr[y]) {
continue;
}
for (int j = 0; j < i; j++) {
if (arr[i] > arr[j])
DP[i] += arr[j];
maxSum = max(maxSum, DP[i]);
}
}
if (maxSum == -1) {
return arr[y];
}
return maxSum + arr[y];
}
int main(){
int arr[] = {1, 5, 9, 131, 6, 100, 11, 215};
int N = sizeof(arr) / sizeof(arr[0]);
int x = 4, y = 6;
cout<<"The maximum sum increasing subsequence from a prefix and a given element after prefix is must is ";
cout<<calcMaxSum(arr, N, x, y);
return 0;
} আউটপুট
The maximum sum increasing subsequence from a prefix and a given element after prefix is must is 26