คำชี้แจงปัญหา
กำหนดสตริงที่ประกอบด้วยหนึ่งและศูนย์ ภารกิจคือการค้นหาความยาวสูงสุดของเซ็กเมนต์ของสตริงเพื่อให้จำนวน 1 ในแต่ละเซ็กเมนต์มีค่ามากกว่า 0
ตัวอย่าง
หากสตริงอินพุตคือ “10111000001011” คำตอบจะเป็น 12 ดังนี้ −
- ส่วนแรกมีความยาว 7 1011100000001011
- ส่วนที่สองมีความยาว 5 10111000001011
- ความยาวทั้งหมดคือความยาวของ (ส่วนที่ 1 + กลุ่มที่ 2) =(7 + 5) =12
อัลกอริทึม
- ถ้า start ==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