原题链接:https://leetcode-cn.com/problems/ones-and-zeroes/
动态规划
dp[n][m] n是1的个数,m是0个个数
状态转移
dp[i][j] = max(dp[i][j], dp[i - num_1][j - num_0]),num_1和num_0是一个字符串使用的1和0个数。
本题通过三层循环,注意,最外层是字符串的循环,因为每个字符串只用一次,所以放在最外层,内层循环判断不同的dp[i][j]对该字符串能否构成,如果可以就加1。并且对不同的dp[i][j]当然要取最大值。
代码:
inline void count(string str, int &num_0, int &num_1){
num_0 = 0, num_1 = 0;
int len = str.size();
for (int i = 0; i < len; i++){
if (str[i] == '0') num_0++;
else if (str[i] == '1')num_1++;
}
}
int findMaxForm(vector<string>& strs, int m, int n) {
int len=strs.size();
vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
int num_0, num_1;
for (int k=0; k<len; k++){
count(strs[k], num_0, num_1);
for (int i=n; i>=num_1; i--){
for (int j=m; j>=num_0; j--){
dp[i][j] = max(dp[i][j], dp[i - num_1][j - num_0] + 1);
}
}
}
return dp[n][m];
}