474. Ones and Zeroes

来源:互联网 发布:淘宝达人申请直播入口 编辑:程序博客网 时间:2024/06/09 21:46

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:

  1. The given numbers of 0s and 1s will both not exceed 100
  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解题。动规原则是这个1或者0用不用,状态数组初始化为dp[m+1][n+1]。遍历每一个字符串,比较每一个dp[i][j]和dp[i - countZero][j - countOne]+1的大小。代码如下:

public class Solution {    public int findMaxForm(String[] strs, int m, int n) {        int[][] res = new int[m + 1][n + 1];        for (String str: strs) {            int countZero = 0, countOne = 0;            for (char ch :str.toCharArray()) {                if (ch == '1') {                    countOne ++;                } else {                    countZero ++;                }            }            for (int i = m; i >= countZero; i --) {                for (int j = n; j >= countOne; j --) {                    res[i][j] = Math.max(res[i][j], res[i - countZero][j - countOne] + 1);                }            }        }        return res[m][n];    }}

0 0