当前位置: 首页 > article >正文

LeetCode474:一和零

题目链接:474. 一和零 - 力扣(LeetCode)

代码如下

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        vector<vector<int> > dp(m + 1, vector<int>(n + 1, 0));
        for(string str : strs)
        {
            int oneNum = 0, zeroNum = 0;
            for(char ch : str)
            {
                if(ch == '0')   oneNum++;
                else    zeroNum++;
            }
            for(int i = m; i >= oneNum; i--)
            {
                for(int j = n; j >= zeroNum; j--)
                {
                    dp[i][j] = max(dp[i][j], dp[i - oneNum][j - zeroNum] + 1);
                }
            }
        }
        return dp[m][n];
    }
};

这个代码其实也很好的理解为是多维度的01背包问题,也就是说,我们有两个背包容量,去选择价值最大的物品,首先我们需要先遍历这个字符串的数组的每一个字符,先把字符的0和1分别统计下来,然后去统计好oneNum和zeroNum的数值,再去用01背包的递推公式去解开这个问题。

这里要讲一下递推公式是怎么来的,其实这个也就是相当于三维数组了(没优化先),01背包优化之后遍历的时候都需要两层for循环了,所以这个多维度的背包问题,肯定就是需要三重for循环。顾名思义,题目给了最多有m个0和n个1也就是这两个维度的背包容量了,然后就是拓展二维就好。


http://www.kler.cn/news/339926.html

相关文章:

  • 【算法系列-哈希表】两个集合的交集问题
  • RemoteView(kotlin)
  • C#t:dynamic
  • 【大模型 AI 学习】大模型 AI 部署硬件配置方案(本地硬件配置 | 在线GPU)
  • C# WinForms 控制权限到按钮级别
  • wordpress发邮件SMTP服务器配置步骤指南?
  • 1111111111
  • Linux终端管理效率:深入学习Screen
  • 手机一键换IP地址软件:功能、应用与选择指南‌
  • 如何理解运行 lspci 命令得到的输出信息?
  • 计算机毕业设计 基于Flask+vue的博客系统的设计与实现 Python毕业设计 Python毕业设计选题 Flask框架 Vue【附源码+安装调试】
  • 【Redis】List类型的常用命令大全
  • WordPress修改固定链接后301的重定向方法
  • 使用root账号ssh登录虚拟机ubuntu
  • 算法(最大异或对)
  • 《Python 安装指南:开启编程之旅》
  • 项目完整开发的流程
  • 安装 Anaconda
  • Python 从入门到实战34(实例2:绘制蟒蛇)
  • yolov8-pose的TensorRT动态库部署(C++)