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

Leetcode 474. 一和零 多重背包问题,动态规划

原题链接:Leetcode 474. 一和零
在这里插入图片描述

参考官解:Leetcode 474. 一和零

三维数组:

class Solution {
public:
    vector<int> sum01(string s) {
        int a = 0, b = 0;
        for (auto x : s) {
            if (x == '0')
                a++;
            else
                b++;
        }
        return {a, b};
    }
    int findMaxForm(vector<string>& strs, int m, int n) {
        int l = strs.size();
        // dp[i][j][k]表示使用前i个字符,最多有j个0,k个1的最大子集的长度
        int dp[l + 1][m + 1][n + 1];
        for (int i = 0; i <= l; i++) {
            int a = 0, b = 0;
            if (i > 0) {
                vector<int> tmp = sum01(strs[i - 1]);
                a = tmp[0];
                b = tmp[1];
            }
            for (int j = 0; j <= m; j++) {
                for (int k = 0; k <= n; k++) {
                    if (i == 0) {
                        dp[i][j][k] = 0;
                    } else {
                        if (j < a || k < b) {
                            dp[i][j][k] = dp[i - 1][j][k];
                        } else {
                            dp[i][j][k] = max(dp[i - 1][j - a][k - b] + 1,
                                              dp[i - 1][j][k]);
                        }
                    }
                }
            }
        }
        return dp[l][m][n];
    }
};

空间优化

class Solution {
public:
    vector<int> sum01(string s) {
        int a = 0, b = 0;
        for (auto x : s) {
            if (x == '0')
                a++;
            else
                b++;
        }
        return {a, b};
    }
    int findMaxForm(vector<string>& strs, int m, int n) {
        int l = strs.size();
        // dp[j][k]表示使用前i个字符,最多有j个0,k个1的最大子集的长度
        int dp[m + 1][n + 1];
        for (int i = 0; i <= l; i++) {
            int a = 0, b = 0;
            if (i > 0) {
                vector<int> tmp = sum01(strs[i - 1]);
                a = tmp[0];
                b = tmp[1];
            }
            for (int j = m; j >= a; j--) {
                for (int k = n; k >= b; k--) {
                    if (i == 0) {
                        dp[j][k] = 0;
                    } else {
                        dp[j][k] = max(dp[j - a][k - b] + 1, dp[j][k]);
                    }
                }
            }
        }
        return dp[m][n];
    }
};

http://www.kler.cn/a/504853.html

相关文章:

  • linux通过web向mac远程传输字符串,mac收到后在终端中直接打印。
  • JavaSE学习心得(反射篇)
  • 【初识扫盲】厚尾分布
  • VUE3 VITE项目在 npm 中,关于 Vue 的常用命令有一些基础命令
  • 【CSS】HTML页面定位CSS - position 属性 relative 、absolute、fixed 、sticky
  • [0405].第05节:搭建Redis主从架构
  • QT 键值对集合QMap
  • 【WEB】网络传输中的信息安全 - 加密、签名、数字证书与HTTPS
  • 标准通上线标准「全文检索」功能,提升查询精准度!
  • Android控件底色蓝色无法修改、高版本无法安装app、找不到xml、找不到java文件、目录不显示等问题
  • windows下编译php源码
  • 基于PyQt - 6的医疗多模态大模型医疗研究系统中的创新构建与应用(上 .文章部分)
  • 神经网络
  • TCP 连接状态标识 | SYN, FIN, ACK, PSH, RST, URG
  • 链路追踪SkyWalking
  • Shell正则表达式与文本处理三剑客(grep、sed、awk)
  • MongoDB 大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用
  • 科研总结系列|2-GPT学术写作提示词集锦手册
  • mysql 双主双从 + proxysql 代理
  • fpga系列 HDL:跨时钟域同步 双触发器同步器
  • 在 Webpack 中使用 预加载(Preloading) 技术可以通过动态导入(import())以及指定预加载的方式来进行优化
  • 新版AndroidStudio通过系统快捷创建带BottomNavigationView的项目踩坑记录
  • 服务器、电脑和移动手机操作系统
  • HDMI接口
  • 代码随想录算法训练营第十三天(2)|541. 反转字符串II
  • 在服务器上增加新网段IP的路由配置