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".
题解:
想到dp但是没想到如何分割子问题,参考了高赞答案。
逆向实现问题分割,每添加一个字符串,动态将m,n降为0的过程分割。
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
int l = strs.size();
vector<int> zeros(l, 0);
vector<int> ones(l, 0);
vector<vector<int>> dp(m + 1, vector<int> (n + 1, 0));
for (int j = 0; j < l; j++) {
string s = strs[j];
for (int i = 0; i < s.length(); i++) {
if (s[i] == '0') {
zeros[j]++;
}
else if (s[i] == '1') {
ones[j]++;
}
}
}
for (int k = 0; k < l; k++) {
for (int i = m; i >= zeros[k]; i--) {
for (int j = n; j >= ones[k]; j--) {
dp[i][j] = max(dp[i - zeros[k]][j - ones[k]] + 1, dp[i][j]) ;
}
}
}
return dp[m][n];
}
};