题目链接
1.确定状态:
f
[
i
]
[
j
]
f[i][j]
f[i][j]:表示最多容纳
i
i
i 个 0,
j
j
j 个 1,属性表示最多容纳的字符串数量。
2.状态转移:当
i
i
i 和
j
j
j 的容量都大于当前字符串中 0 和 1 的数量的时候,当前字符串可以选择,否则不能选,即状态转移
f
[
i
]
[
j
]
=
m
a
x
(
f
[
i
]
[
j
]
,
f
[
i
−
当
前
字
符
串
0
的
数
量
]
[
j
−
当
前
字
符
串
1
的
数
量
]
+
1
)
f[i][j]=max(f[i][j],f[i-当前字符串0的数量][j-当前字符串1的数量]+1)
f[i][j]=max(f[i][j],f[i−当前字符串0的数量][j−当前字符串1的数量]+1);
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<int>> f(m+1, vector<int>(n+1));
for(auto& x : strs)
{
int zero = 0, one = 0;
for(auto y : x)
if(y == '1') one++;
else zero++;
for(int i = m; i >= zero; --i)
for(int j = n; j >= one; --j)
f[i][j] = max(f[i][j], f[i-zero][j-one] + 1);
}
return f[m][n];
}
};