题目描述
题解
动态规划
这道题是0-1背包问题的应用, 思路根据背包问题来, 想象有一个背包, 它有若干个0和1字符. 对于每个字符串, 都可以选择放或者不放进去, 如果放进去就消耗一部分0和1的数量.
状态定义
对状态dp[i][j][k]
的定义为,输入字符串在子区间 [0, i]
能够使用 j
个 0
和 k
个 1
的字符串的最大数量。
状态转移方程
根据0-1背包问题的解题思路可知, 选择为放或者不放
如果选择放入:
1 | dp[i][j][k] = Math.max(dp[i - 1][j][k], dp[i - 1][j - zeros][k - ones] + 1); |
如果选择不放入:
1 | dp[i][j][k] = dp[i - 1][j][k]; |
初始值
将该三维数组的每个值都初始化为0即可
1 | public class lc474 { |
状态压缩
因为每个字符串只与前一个有关系, 所以可以使用滚动数组
来压缩空间, 这里要注意逆向循环
1 | public int findMaxForm(String[] strs, int m, int n) { |