leetcode 474 一和零

一、题目描述

二、解题思路

解法一:深度优先搜索+剪枝(超时)

本题实际上与0/1背包问题类似,即子集问题的变种,可以采用深度优先搜索+剪枝来解决这个问题,对于每一个字符串,只有选择和不选择两种决策。

解法二:动态规划

dpij表示m=i,n=j时,最大的子集数,对于每一个字符串,只有选择与不选择两种情况,所以dpij=max(dpij,dpi-zerosj-ones),这就是状态转移方程,依此来写就可以了。

三、代码实现

解法一:深度优先搜索+剪枝(超时)

cpp 复制代码
class Solution {
    int length;
    vector<vector<int>> count;
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        //初始化全局变量
        length=0;
        
        //初始化count数组,记录每个字符串中'0'和'1'的个数
        count.resize(strs.size(),vector<int>(2,0));
        for(int i=0;i!=strs.size();i++){
            for(auto ch:strs[i]){
                if(ch=='0') count[i][0]++;
                else if(ch=='1') count[i][1]++;
            }
        }

        dfs(strs,0,m,n,0);
        return length;
    }
    void dfs(vector<string>& strs,int start,int m,int n,int currentLength){
        //递归出口
        if(start==strs.size()){
            length=max(length,currentLength);
            return ;
        }

        //当前字符串的'1'和'0'的数量
        int zeros=count[start][0];
        int ones=count[start][1];

        //选
        if(m>=zeros&&n>=ones)
            dfs(strs,start+1,m-zeros,n-ones,currentLength+1);
        //不选
        dfs(strs,start+1,m,n,currentLength);
    }
};

解法二:动态规划(可通过)

cpp 复制代码
class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        //动态规划
        //dp[i][j]表示m=i,n=j时,最大子集的长度
        vector<vector<int>> dp(m+1,vector<int>(n+1,0));
        for(auto str:strs){
            int zeros=count(str.begin(),str.end(),'0');
            int ones=(int)str.size()-zeros;
            //填写dp数组
            for(int i=m;i>=zeros;i--)
                for(int j=n;j>=ones;j--)
                    dp[i][j]=max(dp[i][j],dp[i-zeros][j-ones]+1);
        }
        return dp[m][n];
    }
};
相关推荐
Frank_refuel8 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
2601_949950639 小时前
练题簿在线免费刷题 从资料整理到考前自测
面试·职场和发展·pdf·word·刷题
hetao173383710 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia62611 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan11 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_9603563812 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah12 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO912 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician12 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
lsc_blog12 小时前
远程和居家办公的经历,技术简历上怎么摆
面试·职场和发展·重构·pdf·求职招聘