一和零
思路
- 状态表示:
dp[i][j][k]
表示,从前i
个元素中选,字符0
不超过j
,字符1
不超过k
,所有选法中,最大的长度; - 状态转移方程:根据第
i
个位置的状态来分析,我们令第i
个元素中0
的个数为a
,1
的个数为b
- 不选第
i
个元素,则dp[i - 1][j][k]
- 选第
i
个元素,则dp[i - 1][j - a][k - b] + 1
(但此时需要特判,即j >= a, k >= b
)
- 不选第
- 初始化:因为
j, k
在填表时会特判,所以我们仅考虑i = 0
,此时从0
个元素中选,空集,所以为0
- 填表顺序:
i
从小到大即可; - 返回值:
dp[len][m][n]
C++代码
class Solution
{
public:
int findMaxForm(vector<string>& strs, int m, int n)
{
int len = strs.size();
vector<vector<vector<int>>> dp(len + 1, vector<vector<int>>((m + 1), vector<int>(n + 1)));
for(int i = 1; i <= len; i++)
{
// 0 1
int a = 0, b = 0;
for(auto s : strs[i - 1])
if(s == '0') a++;
else b++;
for