সমস্যা বিবৃতি
এক এবং শূন্য সমন্বিত একটি স্ট্রিং দেওয়া হয়েছে। কাজটি হল স্ট্রিং এর সেগমেন্টের সর্বোচ্চ দৈর্ঘ্য খুঁজে বের করা যাতে প্রতিটি সেগমেন্টে 1 এর সংখ্যা 0 এর থেকে বেশি হয়
উদাহরণ
যদি ইনপুট স্ট্রিং হয় "10111000001011" উত্তরটি 12 হবে নিম্নরূপ −
- প্রথম অংশের দৈর্ঘ্য 7 10111000001011
- দ্বিতীয় সেগমেন্টের দৈর্ঘ্য 5 10111000001011
- মোট দৈর্ঘ্য হল (সেগমেন্ট 1 + সেগমেন্ট 2) =(7 + 5) =12 এর দৈর্ঘ্য
অ্যালগরিদম
- যদি শুরু হয় ==n তাহলে 0 ফেরত দিন।
- শুরু থেকে n পর্যন্ত একটি লুপ চালান, n পর্যন্ত প্রতিটি সাবয়ারের জন্য গণনা করুন।
- অক্ষর 1 হলে 1-এর সংখ্যা বাড়ান অন্যথায় 0-এর সংখ্যা বাড়ান।
- যদি 1-এর গণনা 0-এর বেশি হয়, তাহলে সূচী (k+1) অর্থাৎ পরবর্তী সূচকের জন্য পুনরাবৃত্তভাবে ফাংশনটি কল করুন এবং অবশিষ্ট দৈর্ঘ্য যোগ করুন যেমন k-start+1।
- অন্যথায় পরবর্তী সূচক k+1 এর জন্য শুধুমাত্র পুনরাবৃত্তভাবে ফাংশনটি কল করুন।
- dp[start] ফেরত দিন।
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
int getSegmentWithMaxLength(int start, string str, int n, int dp[]) {
if (start == n) {
return 0;
}
if (dp[start] != -1) {
return dp[start];
}
dp[start] = 0;
int one = 0;
int zero = 0;
int k;
for (k = start; k < n; ++k) {
if (str[k] == '1') {
++one;
} else {
++zero;
} if (one > zero) {
dp[start] = max(dp[start], getSegmentWithMaxLength(k + 1, str, n, dp) + k - start + 1);
} else {
dp[start] = max(dp[start], getSegmentWithMaxLength(k + 1, str, n, dp));
}
}
return dp[start];
}
int main() {
string str = "10111000001011";
int n = str.size();
int dp[n + 1];
memset(dp, -1, sizeof(dp));
cout << "Maximum length of segment = " << getSegmentWithMaxLength(0, str, n, dp) << endl;
return 0;
} আউটপুট
যখন আপনি উপরের প্রোগ্রামটি কম্পাইল এবং এক্সিকিউট করবেন। এটি নিম্নলিখিত আউটপুট −
তৈরি করেMaximum length of segment = 12