สมมติว่าเรามีผู้ปกครองของ m 0s และ n 1s ตามลำดับ ในทางกลับกัน มีอาร์เรย์ที่มีสตริงไบนารี ตอนนี้งานของเราคือค้นหาจำนวนสตริงสูงสุดที่เราสามารถสร้างได้ด้วย m 0s และ n 1s ที่กำหนด แต่ละ 0 และ 1 สามารถใช้ได้สูงสุดครั้งเดียว ดังนั้นหากอินพุตเป็นเหมือน Array =[“10”, “0001”, “111001”, “1”, “0”,] และ m =5 และ n =3 ผลลัพธ์จะเป็น 4 นั่นเป็นเพราะมี ทั้งหมด 4 สตริงสามารถสร้างโดยใช้ 5 0s และ 3 1s ซึ่งก็คือ “10,0001”,”1”,”0”.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สร้างเมทริกซ์ขนาด (m + 1) x (n + 1)
- ret :=0
- สำหรับฉันในช่วง 0 ถึงขนาดของอาร์เรย์ strs
- หนึ่ง :=0, ศูนย์ :=0
- สำหรับ j ในช่วง 0 ถึงขนาดของ strs[i]
- เพิ่ม 1 เมื่อ star[i, j] เป็น 1 หรือเพิ่มศูนย์เมื่อเป็น 0
- สำหรับ j ในช่วง m ลงไปที่ 0
- สำหรับ j ในช่วง n ลงไปที่หนึ่ง
- dp[j,k] :=สูงสุดของ dp[j,k] และ 1 + dp[j – ศูนย์, k - หนึ่ง]
- ret :=สูงสุดของ ret และ dp[j,k]
- สำหรับ j ในช่วง n ลงไปที่หนึ่ง
- คืนสินค้า
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector < vector <int> > dp(m + 1, vector <int>(n + 1));
int ret = 0;
for(int i = 0; i < strs.size(); i++){
int one = 0;
int zero = 0;
for(int j = 0; j < strs[i].size(); j++){
one += strs[i][j] == '1';
zero += strs[i][j] == '0';
}
for(int j = m; j>= zero; j--){
for(int k = n; k >= one; k--){
dp[j][k] = max(dp[j][k], 1 + dp[j - zero][k - one]);
ret = max(ret, dp[j][k]);
}
}
}
return ret;
}
};
main(){
vector<string> v = {"10","0001","111001","1","0"};
Solution ob;
cout << (ob.findMaxForm(v, 5, 3));
} อินพุต
["10","0001","111001","1","0"] 5 3
ผลลัพธ์
4