474. Ones and Zeroes

来源:互联网 发布:马尔萨斯陷阱 知乎 编辑:程序博客网 时间:2024/05/22 17:50

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:

  1. The given numbers of 0s and 1s will both not exceed100
  2. The size of given string array won't exceed 600.

Example 1:

Input: Array = {"10", "0001", "111001", "1", "0"}, m = 5, n = 3Output: 4Explanation: 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 = 1Output: 2Explanation: You could form "10", but then you'd have nothing left. Better form "0" and "1".

用一二维数组dp, dp[i][j]表示由I个0, j个1组成的字符串的个数, 遍历字符串数组strs, 每次遍历, 统计字符串的0、1个数zeros、ones, 用dp[I - zeros][j - ones]表示还能拼成字符串的个数, 然后将该个数加1, 再于原dp[i][j]比较大小, 递推关系为: dp[i][j] = max(dp[i][j], dp[I - zeros][j - ones] + 1).

class Solution {public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));for (vector<string>::iterator itr1 = strs.begin(); itr1 != strs.end(); ++itr1){int ones = 0;int zeros = 0;for (string::iterator itr2 = itr1->begin(); itr2 != itr1->end(); ++itr2){if (*itr2 == '0') ++zeros;else ++ones;}for (int i = m; i >= zeros; --i){for (int j = n; j >= ones; --j)dp[i][j] = max(dp[i][j], dp[i - zeros][j - ones] + 1);}}return dp[m][n];}};