题目链接:https://leetcode.com/problems/ones-and-zeroes/#/description
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[ i ][ j ]表示取最多取i个0,j个1时,可以取多少个字符串,所以 dp[ i ][ j ]=max(dp[ i ][ j ],dp[ i-cnt0 ][ j-cnt1 ]+1),cnt0为其中一个字符串0的个数,
cnt1为其中一个字符串1的个数。
class Solution{
public:
int findMaxForm(vector<string>& strs,int m,int n)
{
vector<vector<int>> dp(m+1,vector<int>(n+1,0));
int cnt0,cnt1;
for(auto str:strs)
{
cnt0=0;
cnt1=0;
for(auto c:str)
{
if(c=='0')
cnt0++;
else
cnt1++;
}
for(int i=m;i>=cnt0;i--)
{
for(int j=n;j>=cnt1;j--)
{
dp[i][j]=max(dp[i][j],dp[i-cnt0][j-cnt1]+1);
}
}
}
return dp[m][n];
}
};