中国建设银行网站e路外链网站推荐
目录
前言:
474. 一和零 - 力扣(LeetCode)
总结:
前言:
今天我们依旧暴打动态规划
474. 一和零 - 力扣(LeetCode)
给你一个二进制字符串数组 strs
和两个整数 m
和 n
。
请你找出并返回 strs
的最大子集的长度,该子集中 最多 有 m
个 0
和 n
个 1
。
如果 x
的所有元素也是 y
的元素,集合 x
是集合 y
的 子集 。
其实这也是一个背包问题,只不过以前我们的限制条件只有一个重量,现在变成了两个,一个是,m,一个是n。那么我们就可以抽象的看他为一个二维的01背包问题。
那么我们就按照动态规划五部曲走:
1.确定dp数组的含义及其下标方式:dp[i][j] 表示装满 i 个0 和 j 个1 的背包中的最大子集长度
class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp(m + 1, vector<int> (n + 1, 0)); for (string str : strs) { int one = 0, zero = 0;for (char c : str) {if (c == '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];}};
总结:
动态规划很难一眼看出来就是背包问题,要仔细甄别
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!