সমস্যায়, আমাদের বিভিন্ন দৈর্ঘ্যের n অ্যারে দেওয়া হয়েছে। আমাদের কাজ হল m এর থেকে কম বা সমান দৈর্ঘ্যের সর্বাধিক সমষ্টি অ্যারে খুঁজে বের করা।
যোগফলকে সর্বাধিক করার জন্য আমাদের অ্যারে থেকে সাব-অ্যারে খুঁজে বের করতে হবে এবং সমস্ত সাবঅ্যারেগুলির দৈর্ঘ্য মি-এর সমান করতে হবে।
সমস্যাটি বোঝার জন্য একটি উদাহরণ নেওয়া যাক,
ইনপুট
n =3, m =4arrOfArr[][] ={ {5, 2, -1, 4, -3} {3, -2, 1, 6} {-2, 0, 5}}পূর্বে>আউটপুট
20ব্যাখ্যা
সাবঅ্যারেগুলি হল {5, 4}, {6}, {5},দৈর্ঘ্য =2 + 1 + 1 =4সমষ্টি =5 + 4 + 6 + 5 =20সমাধান পদ্ধতি
একটি গতিশীল প্রোগ্রামিং পদ্ধতি ব্যবহার করে সমস্যার সমাধান করা যেতে পারে। আমরা একটি DP অ্যারে তৈরি করব এবং k দৈর্ঘ্যের ক্রমবর্ধমান অ্যারের যোগফল গণনা করব যা 0 থেকে m পর্যন্ত পরিবর্তিত হয়।
DP অ্যারেতে, 2D ডিপিতে 0 থেকে m foreach অ্যারে পর্যন্ত সমস্ত দৈর্ঘ্যের জন্য সর্বাধিক অ্যারের যোগফল সংরক্ষণ করুন। তারপর সর্বোচ্চ যোগফল ফেরত দিন যা অ্যারের শেষ সারিতে হবে।
আমাদের সমাধানের কাজ চিত্রিত করার জন্য প্রোগ্রাম,
উদাহরণ
#includenamespace ব্যবহার করে std;#define N 5int findMax(int a, int b){ if(a> b) রিটার্ন a; রিটার্ন b;}int findMaxSumArray(int arr[][N], int M) { int DP[N][M]; int sumArray[M]; int sum[M]; memset(DP, -1, sizeof(DP[0][0]) * N * M); sumArray[0] =0; DP[0][0] =0; জন্য (int i =1; i <=5; i++) { int len =arr[i - 1][0]; (int j =1; j <=len; j++) { sumArray[j] =arr[i - 1][j]; sumArray[j] +=sumArray[j - 1]; যোগফল [j] =-100; } for (int j =1; j <=len &&j <=6; j++) for (int k =1; k <=len; k++) যদি (j + k - 1 <=len) যোগফল[j] =FindMax(sum[j], sumArray[j + k - 1] - sumArray[k - 1]); জন্য (int j =0; j <=6; j++) DP[i][j] =DP[i - 1][j]; (int j =1; j <=6; j++) এর জন্য (int cur =1; cur <=j &&cur <=len; cur++) DP[i][j] =findMax(DP[i][j] , DP[i - 1][j - cur] + যোগফল[cur]); } int maxSum =0; জন্য (int i =0; i <=6; i++) maxSum =findMax(maxSum, DP[5][i]); রিটার্ন maxSum;}int main() { int arr[][N] ={ { 3, 2, -1, 6 }, { 2, 7, -1 }, { 3, 2, 2, -4 } }; int m =4; cout<<""< আউটপুট
4 :15 এর থেকে কম বা সমান দৈর্ঘ্যের সর্বোচ্চ যোগফল বিন্যাস