原题网址:https://leetcode.com/problems/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
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:
0s
and 1s
will both not exceed 100
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".
方法:动态规划。
Java代码:
public class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] max = new int[m+1][n+1];
for(String str : strs) {
int[] counts = count(str);
for(int i = m; i >= counts[0]; i--) {
for(int j = n; j >= counts[1]; j--) {
max[i][j] = Math.max(max[i][j], 1 + max[i - counts[0]][j - counts[1]]);
}
}
}
return max[m][n];
}
private int[] count(String str) {
char[] sa = str.toCharArray();
int[] counts = new int[2];
for(int i = 0; i < sa.length; i++) {
counts[sa[i] - '0'] ++;
}
return counts;
}
}
class Solution(object):
def findMaxForm(self, strs, m, n):
"""
:type strs: List[str]
:type m: int
:type n: int
:rtype: int
"""
dp = [[0 for x in range(n + 1)] for y in range(m + 1)]
for str in strs:
c0, c1 = str.count("0"), str.count("1")
for i in range(m, c0 - 1, -1):
for j in range(n, c1 - 1, -1):
dp[i][j] = max(dp[i][j], 1 + dp[i - c0][j - c1])
return dp[m][n]