Leetcode 474. Ones and Zeroes
题目
解法1:动态规划
这也是一个0,1背包问题,但是有两个背包,分别是0的数量和1的数量。所以相应最直观的解法如下:
- 定义一个3维的dp数组,长度分别为L+1,m+1,n+1,l,m,n分别为string的数量,0的数量和1的数量
- dp[L][i][j]代表当包含前L个string,并且有i个0,j个1的时候,能形成的string最大数量是多少
- 更普通背包问题一样,当前的结果应该等于取当前的string和不取当前string的最大值,状态转移方程为:
// zeros和ones代表当前正在遍历的string包含的0的个数或者1的个数
if (j>=zeros && k>=ones)
dp[i][j][k] = max(dp[i-1][j][k], 1 + dp[i-1][j-zeros][k-ones] );
else
dp[i][j][k] = dp[i-1][j][k];
由于python好像没有表示3维数组的方法,所以这边是用C++来写的,代码如下:
typedef vector<int> v1d;
typedef vector<v1d> v2d;
typedef vector<v2d> v3d;
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
int l = strs.size();
v3d dp(l+1, v2d(m+1, v1d(n+1, 0)))</