leetcode474
题目要求
1 | In the computer world, use restricted resource you have to generate maximum benefit is what we always want to pursue. |
已知有m个0和n个1,问最多能构成数组中多少个数字。已知每个0和1只能使用一次。
思路和代码
先是用深度优先遍历的思想进行了实现,结果很明显是超时了。接着采用动态规划的思想,其实这题就是背包问题的一个演化。假设已知道m个0和n个1能够从数组中前i个元素最多拼成多少个元素,则m个0和n个1能够从数组中前i+1个元素能够拼成最多的元素个数有如下两个场景:
- 第i+1个字符串的0的个数和1的个数分别小于m和n,则有两种选择,分别是选择该字符串和不选择该字符串,选择该字符串的话,max[i+1][m][n] = 1 + max[i][m-numOfZero(str)][n-numOfOne(str)], 如果不选择的话,max[i+1][m][n] = max[i-1][m][n]。从两个选项中选择一个最大的即可。
- 否则的话,max[i+1][m][n] = max[i][m][n]
代码如下:
1 | public int findMaxForm2(String[] strs, int m, int n) { |