在计算机世界中, 由于资源限制, 我们一直想要追求的是产生最大的利益.
现在,假设你分别是 m个 0s 和 n个 1s 的统治者. 另一方面, 有一个只包含 0s 和 1s 的字符串构成的数组.
现在你的任务是找到可以由 m个 0s 和 n个 1s 构成的字符串的最大个数. 每一个 0 和 1 均只能使用一次
思路:动态规划,我们用一个三维的数组来存储状态。
public class Solution {
/**
* @param strs: an array with strings include only 0 and 1
* @param m: An integer
* @param n: An integer
* @return: find the maximum number of strings
*/
public int findMaxForm(String[] strs, int m, int n) {
// write your code here
int len = strs.length;
//第一个表示前i个字符串,后面表示的是有多少0和1
int[][][] f = new int[len + 1][m + 1][n + 1];
//在没有字符串的时候,只能拼出0个
for(int i = 0; i <= m; i++){
for(int j = 0; j <= n; j++){
f[0][i][j] = 0;
}
}
int a0,a1;
for(int i = 1; i <= len; i++){
char[] s = strs[i - 1].toCharArray();
a0 = a1 = 0;
for(int p = 0; p < s.length; p++){
if(s[p] == '0'){
a0++;
}else{
a1++;
}
}
for(int j = 0; j <= m; j++){
for(int k = 0; k <= n; k++){
f[i][j][k] = f[i - 1][j][k];
if(j >= a0 && k >= a1){
f[i][j][k] = Math.max(f[i][j][k], f[i - 1][j - a0][k - a1] + 1);
}
}
}
}
return f[len][m][n];
}
}