-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path474-ones-and-zeroes.cpp
80 lines (75 loc) · 2.12 KB
/
474-ones-and-zeroes.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
//
//
// 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。
//
//
// 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。
//
//
//
// 示例 1:
//
//
//输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
//输出:4
//解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 。
//其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"} 。{"111001"} 不满足题意,因为它含 4 个 1 ,大于
//n 的值 3 。
//
//
// 示例 2:
//
//
//输入:strs = ["10", "0", "1"], m = 1, n = 1
//输出:2
//解释:最大的子集是 {"0", "1"} ,所以答案是 2 。
//
//
//
//
// 提示:
//
//
// 1 <= strs.length <= 600
// 1 <= strs[i].length <= 100
// strs[i] 仅由 '0' 和 '1' 组成
// 1 <= m, n <= 100
//
//
// Related Topics 数组 字符串 动态规划 👍 998 👎 0
#include "headers.h"
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public:
int findMaxForm(vector<string> &strs, int m, int n) {
// 1.dp[i][j]: 容量 m 为 i, 容量 n 为 j 的情况下,背包中能存放的最多元素的个数
// 2. 第 t 个元素,
// dp[i][j] = max(dp[i][j], dp[i-zero[t]][j-one[t]] + 1)
// 3. 初始化
// dp[0][0] = 0;
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
// 4. 遍历顺序
for (auto str: strs) {
int zero = 0, one = 0;
for (char ch: str) {
if (ch == '0') zero++;
else
one++;
}
for (int i = m; i >= zero; --i) {
for (int j = n; j >= one; --j) {
dp[i][j] = max(dp[i][j], dp[i - zero][j - one] + 1);
}
}
}
return dp[m][n];
}
};
//leetcode submit region end(Prohibit modification and deletion)
int main() {
Solution s;
vector<int> arr{7, 1, 5, 3, 6, 4};
auto res = s.twoSum(arr, 11);
showVector(res);
}