474. Ones and Zeroes
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
andn 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 givenm 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".
题意:给定m个0和n个1,最多能组成字符串数组中的多少个字符串。
思路:动态规划,每次遇到一个字符串,都要考虑如果组成这一字符串的后果,采用备忘录的自顶向下的动态规划方法实现。
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
int dp[m+1][n+1];
int i,j;
for(i=0;i<=m;i++)
for(j=0;j<=n;j++)
dp[i][j]=0;
for(auto str:strs){
vector<int> cnt=count(str);
for(i=m;i>=cnt[0];i--)
for(j=n;j>=cnt[1];j--)
dp[i][j]=max(1+dp[i-cnt[0]][j-cnt[1]],dp[i][j]);
}
return dp[m][n];
}
vector<int> count(string & s){
vector<int> ans(2,0);
for(char c:s)
ans[c-'0']++;
return ans;
}
};