题目:
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
0sand1swill 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和1分别。另一方面,有一个只有0和1组成的字符串数组。
现在你的任务是找到可以形成了M 0和1的最大字符串数。每0和1可以用在最一次。
注:
给定数字0和1都将不超过100
给定字符串数组的大小不会超过600。
例1:
输入:数组= {“10”,“0001”,“111001”,“1”,“0”},m = 5,N = 3
输出:4
说明:这是4个字符串可以由5个0和3 1秒的使用形成的,这是“10”,“0001”、“1”、“0”
例2:
输入:数组= {“10”,“0”,“1”},m = 1,N = 1
输出:2
说明:你可以形成“10”,但是你什么都没有了。更好地形成“0”和“1”。
解题代码:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector< vector<int> > dp(m+1, vector<int>(n+1,0));
int zeros ,ones ;
for(int i = 0; i< strs.size(); i++) {
zeros = ones = 0;
for(int j = 0; j < strs[i].length(); j++) {
if(strs[i][j] == '0') zeros++;
else ones++;
}
for(int a = m; a >= zeros; a--) {
for(int b = n; b >= ones; b--) {
dp[a][b] = max( dp[a][b], dp[a-zeros][b-ones]+1 );//一定要从后往前,否则一旦小范围的被赋值,更大范围的会再次赋值累积到很多会发生错误
}
}
}
return dp[m][n];
}
};
int main() {
string strs[] = {"10", "0001", "111001", "1", "0"};
vector<string> v(strs,strs+ 5);
Solution s;
cout << s.findMaxForm(v, 5, 3) <<endl;
}
题目状态:
5121

被折叠的 条评论
为什么被折叠?



