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 only0s
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 mostonce.
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".
Subscribe to see which companies asked this question.
题意:给出一个string数组,string由0/1构成,现有m个0,n个1,最多可以构成多少个string
思路:dp,ans[i][j]表示i个0,j个1的时候可以构成string的最大值,参考0/1背包
只要是dp就做不出来系列orz 不过思路已经接近了0 0 还得修炼,叹气
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
int len = strs.size();
vector<vector<int>> ans(m + 1, vector<int>(n + 1, 0));
for (int i = 0; i < len; i++) {
int s_len = strs[i].length();
int cnt0 = 0, cnt1 = 0;
for (int j = 0; j < s_len; j++) {
if (strs[i][j] == '0') cnt0++;
else cnt1++;
}
for (int k1 = m; k1 >= cnt0; k1--) {
for (int k2 = n; k2 >= cnt1; k2--) {
ans[k1][k2] = max(ans[k1][k2], ans[k1-cnt0][k2-cnt1] + 1);
}
}
}
return ans[m][n];
}
};