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

动态规划理论基础和习题【力扣】【算法学习day.26】

前言

###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.一和零

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

题面:

基本分析:将该问题转化为背包问题,则f【k】【i】【j】,当考虑到第k个物品,0的个数不超过i,1的个数不超过j的最大子串数目

代码:

class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        int len = strs.length;
        // 预处理每一个字符包含 0 和 1 的数量
        int[][] cnt = new int[len][2];
        for (int i = 0; i < len; i++) {
            String str = strs[i];
            int zero = 0, one = 0;
            for (char c : str.toCharArray()) {
                if (c == '0') {
                    zero++;
                } else {
                    one++;
                }
            }
            cnt[i] = new int[]{zero, one}; 
        }

        // 处理只考虑第一件物品的情况
        int[][][] f = new int[len][m + 1][n + 1];
        for (int i = 0; i <= m; i++) {
            for (int j = 0; j <= n; j++) {
                f[0][i][j] = (i >= cnt[0][0] && j >= cnt[0][1]) ? 1 : 0;
            }
        }

        // 处理考虑其余物品的情况
        for (int k = 1; k < len; k++) {
            int zero = cnt[k][0], one = cnt[k][1];
            for (int i = 0; i <= m; i++) {
                for (int j = 0; j <= n; j++) {
                    // 不选择第 k 件物品
                    int a = f[k-1][i][j];
                    // 选择第 k 件物品(前提是有足够的 m 和 n 额度可使用)
                    int b = (i >= zero && j >= one) ? f[k-1][i-zero][j-one] + 1 : 0;
                    f[k][i][j] = Math.max(a, b);
                }
            }
        }
        return f[len-1][m][n];
    }
}

后言

上面是动态规划的基本概念和部分习题,下一篇会有其他习题,希望有所帮助,一同进步,共勉!  


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

相关文章:

  • 快速学习Serde包实现rust对象序列化
  • LeetCode【0016】最接近的三数之和
  • 【人工智能】Transformers之Pipeline(二十三):文档视觉问答(document-question-answering)
  • 机器视觉和计算机视觉的区别
  • iOS 18.2 重磅更新:6个大动作
  • 图像处理椒盐噪声
  • MYSQL隔离性原理——MVCC
  • 实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎
  • mac-泛洪
  • 我的 C# 白盒测试学习路线
  • [C++11] 类中新特性的添加
  • 网页版五子棋——匹配模块(服务器端开发)
  • 梧桐数据库与GBase日期函数比较
  • C++ 越来越像函数式编程了!
  • linux devfreq 模块
  • flink 内存配置(五):网络缓存调优
  • video素材格式转换--mp4转webm(vue3+Nodejs)
  • 如何运营Github Org
  • Hunyuan-Large:推动AI技术进步的下一代语言模型
  • 刘艳兵-DBA027-在Oracle数据库,通常可以使用如下方法来得到目标SQL的执行计划,那么通过下列哪些方法得到的执行计划有可能是不准确的?
  • 鸿蒙next版开发:ArkTS组件自定义事件拦截详解
  • 腾讯混元3D模型Hunyuan3D-1.0部署与推理优化指南
  • 【PGCCC】Postgresql LWLock 原理
  • 孤岛的总面积(Dfs C#
  • IP系列之scan讨论
  • Java学习篇之JVM 调优