leetcode 474.一和零

题目:

在计算机界中,我们总是追求用有限的资源获取最大的收益。

现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。

你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字符串的最大数量。每个 0 和 1 至多被使用一次。

注意:

  1. 给定 0 和 1 的数量都不会超过 100
  2. 给定字符串数组的长度不会超过 600。

分析:

这是我第一次遇到哦01背包问题,想了挺久不过完全没有思路,看了评论区朋友代码的动态转移方程瞬间就懂了...哈哈哈。

不进行方法解释,直接给出代码,忘各位朋友自己理解学习。

代码:

 1 //29ms 80%
 2 class Solution {
 3     public int findMaxForm(String[] strs, int m, int n) {
 4         int[][] dp=new int[m+1][n+1];
 5         for(String s:strs) {
 6             int numz=0,numo=0;
 7             for(char c:s.toCharArray()) {
 8                 if(c=='0')
 9                     numz++;
10                 else
11                     numo++;
12             }
13             for(int i=m;i>=numz;--i)
14                 for(int j=n;j>=numo;--j)
15                     dp[i][j]=Math.max(dp[i][j], dp[i-numz][j-numo]+1);
16         }
17         return dp[m][n];
18     }
19 }

 

posted @ 2019-04-02 16:41  你说你好  阅读(273)  评论(0编辑  收藏  举报