In the computer world, use restricted resource you have to generate maximum benefit is what we always want to pursue.
For now, suppose you are a dominator of m 0s
and n 1s
respectively. On the other hand, there is an array with strings consisting of only 0s
and 1s
.
Now your task is to find the maximum number of strings that you can form with given m 0s
and n 1s
. Each 0
and 1
can be used at most once.
Note:
- The given numbers of
0s
and1s
will both not exceed100
- The size of given string array won't exceed
600
.
Example 1:
Input: Array = {"10", "0001", "111001", "1", "0"}, m = 5, n = 3
Output: 4
Explanation: This are totally 4 strings can be formed by the using of 5 0s and 3 1s, which are “10,”0001”,”1”,”0”
Example 2:
Input: Array = {"10", "0", "1"}, m = 1, n = 1
Output: 2
Explanation: You could form "10", but then you'd have nothing left. Better form "0" and "1".
题解:
这是一个背包问题
三维数组如下:
//Make a 3D Vector
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))); //dp[l+1][m+1][n+1]
for(int i=1;i<=l;i++)
{
string s = strs[i-1];
int ones = count(s.begin(), s.end(), '1');
int zeros = s.size()-ones;
for (int j=0;j<=m;j++)
{
for (int k=0;k<=n;k++)
{
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];
}//k
}//j
}//i
return dp[l][m][n];
}
};
二维数组:
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<int>> dp(m+1,vector<int>(n+1,0));
for (auto &s: strs) {
int ones = count(s.begin(), s.end(), '1');
int zeros= s.size()-ones;
for (int i=m; i>=zeros; i--)
for (int j=n; j>=ones; j--)
dp[i][j] = max(dp[i][j], dp[i-zeros][j-ones]+1);
}
return dp[m][n];
}