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.
思路:使用动态规划思想。子问题为有更少的0和更少的1时能组合出来的最大个数。用deep[i][j]表示有i个0和j个1的情况下最大的个数,循环遍历strs的每一个元素,每遍历一次就看当前情况下可以有的最大的组合个数。所以deep[m][n]为想要的最终结果。
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
int deep[m + 1][n + 1], num0 = 0, num1 = 0;
string temp;
for (int i = 0; i < m + 1; i++) {
for (int j = 0; j < n + 1; j++) {
deep[i][j] = 0;
}
}
for (int i = 0; i < strs.size(); i++) {
temp = strs[i];
num0 = 0;
num1 = 0;
for (int j = 0; j < temp.length(); j++) {
if (temp[j] == '0') {
num0++;
} else {
num1++;
}
}
for (int j = m; j >= num0; j--) {
for (int k = n; k >= num1; k--) {
deep[j][k] = max(deep[j][k], deep[j - num0][k - num1] + 1);
}
}
}
return deep[m][n];
}
};