代码随想录NO38 |动态规划——leetcode 343. 整数拆分 96.不同的二叉搜索树

news2025/7/13 5:00:39

动态规划—leetcode 343. 整数拆分 96.不同的二叉搜索树

今天是动态规划第三天的题,动态规划这块儿题目比较多!

343. 整数拆分

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。

动规五部曲

  • 1.确定dp数组(dp table)以及下标的含义
    dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。
    dp[i]的定义将贯彻整个解题过程,下面哪一步想不懂了,就想想dp[i]究竟表示的是啥!

  • 2.确定递推公式
    可以想 dp[i]最大乘积是怎么得到的呢?
    其实可以从1遍历j,然后有两种渠道得到dp[i].
    一个是j * (i - j) 直接相乘。
    一个是j * dp[i - j],相当于是拆分(i - j),对这个拆分不理解的话,可以回想dp数组的定义。
    j是从1开始遍历,拆分j的情况,在遍历j的过程中其实都计算过了。那么从1遍历j,比较(i - j) * j和dp[i - j] * j 取最大的。递推公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));
    也可以这么理解,j * (i - j) 是单纯的把整数拆分为两个数相乘,而j * dp[i - j]是拆分成两个以及两个以上的个数相乘。

  • 3.dp的初始化
    严格从dp[i]的定义来说,dp[0] dp[1] 就不应该初始化,也就是没有意义的数值。
    这里只初始化dp[2] = 1,从dp[i]的定义来说,拆分数字2,得到的最大乘积是1,这个没有任何异议!

  • 4.确定遍历顺序
    确定遍历顺序,先来看看递归公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));
    dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历,先有dp[i - j]再有dp[i]。
    其次优化:因为拆分一个数n 使之乘积最大,那么一定是拆分成m个近似相同的子数相乘才是最大的。
    例如 6 拆成 3 * 3, 10 拆成 3 * 3 * 4。 100的话 也是拆成m个近似数组的子数 相乘才是最大的。
    只不过我们不知道m究竟是多少而已,但可以明确的是m一定大于等于2,既然m大于等于2,也就是 最差也应该是拆成两个相同的 可能是最大值。
    那么 j 遍历,只需要遍历到 n/2 就可以,后面就没有必要遍历了,一定不是最大值。

  • 5.举例推导dp数组

class Solution:
    def integerBreak(self, n: int) -> int:
        dp = [0] * (n+1)
        dp[2] = 1

        for i in range(3 , n+1):
        # 假设对正整数 i 拆分出的第一个正整数是 j(1 <= j < i),则有以下两种方案:
        # 1) 将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j * (i-j)
        # 2) 将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j * dp[i-j]
            for j in range(1 , (i//2)+1):
                dp[i] = max(dp[i] , max((i-j)*j , dp[i-j]*j))

        return dp[n]

思路对了,其实代码写起来还是挺简单的!

96.不同的二叉搜索树
请添加图片描述

  • 1.确定dp数组(dp table)以及下标的含义
    dp[i] : 1到i为节点组成的二叉搜索树的个数为dp[i]。
    也可以理解是i的不同元素节点组成的二叉搜索树的个数为dp[i] ,都是一样的。

  • 2.确定递推公式
    在上面的分析中,其实已经看出其递推关系, dp[i] += dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量]
    j相当于是头结点的元素,从1遍历到i为止。
    所以递推公式:dp[i] += dp[j - 1] * dp[i - j]; ,j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量

  • 3.dp数组如何初始化
    初始化,只需要初始化dp[0]就可以了,推导的基础,都是dp[0]。
    从定义上来讲,空节点也是一棵二叉树,也是一棵二叉搜索树,这是可以说得通的。
    从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都变成0了。
    所以初始化dp[0] = 1

  • 4.确定遍历顺序
    首先一定是遍历节点数,从递归公式:dp[i] += dp[j - 1] * dp[i - j]可以看出,节点数为i的状态是依靠 i之前节点数的状态。
    那么遍历i里面每一个数作为头结点的状态,用j来遍历。

  • 5.举例推导dp数组

class Solution:
    def numTrees(self, n: int) -> int:
        dp = [0] * (n + 1)
        dp[0], dp[1] = 1, 1
        for i in range(2, n + 1):
            for j in range(1, i + 1):
                dp[i] += dp[j - 1] * dp[i - j]
        return dp[-1]

今天的两道题都是没有思路的,看了题解才懵懵懂的,需要二刷加深理解!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拼经济促发展,雨花区脚踏实地将“民生愿景”变为“幸福实景”

2022年&#xff0c;面对国内外复杂的经济形势&#xff0c;我国经济发展依旧保持稳中向好态势。经济增长总体平稳且后续动力强劲&#xff0c;物价涨幅持续可控&#xff0c;结构调整积极推进。经济增长由政策刺激向自主增长有序转变&#xff0c;继续朝着宏观调控的预期方向发展&a…

Linux环境下Redis单机、集群升级部署

目录 前言 一、Redis安装环境准备 二、安装升级Redis 1.Redis升级前准备&#xff08;首次安装忽略&#xff09; 2.Redis安装 总结 前言 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可…

回顾 | .NET MAUI 跨平台应用开发 - 用 .NET MAUI 开发一个无人机应用(下)

点击蓝字关注我们编辑&#xff1a;Alan Wang排版&#xff1a;Rani Sun微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0c;将…

七、Linux文件 - main函数参数讲解、代码实现cp指令

目录 1、main函数参数 2.cp指令的使用 3、实现cp指令 3.1实现cp指令-入门版 3.2实现cp指令-进阶版 1、main函数参数 int main(int argc,char *argv[]) {return 0; } C语言规定了main函数的参数只能由2个&#xff0c;一个是argc,一个是argv,并且argc只能是整数&#xff0c…

[Leetcode] 打开转盘锁(BFS求最短路径)

题目链接&#xff1a;https://leetcode.cn/problems/open-the-lock/你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字&#xff1a; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 。每个拨轮可以自由旋转&#xff1a;例如把 9 变为 0&#xff0c;0 变为 9 。每次旋转都只能旋转一个拨轮…

你不会还不知道arrify的内部到底是怎么执行的吧?

作为一个前端工程师&#xff0c;经常会遇见转换成数组的需求&#xff0c;被转换的对象有可能是String、Set()、null、Map()、undefined、或者是数组本身。我们最经常的做法就是写一个arrify函数帮我去进行转换。久而久之因为经常会做不同的项目中遇到同样的需求所以我们通常会把…

WeNet - 初识

文章目录关于 WeNet快速上手识别训练环境准备训练关于 WeNet Production First and Production Ready End-to-End Speech Recognition Toolkit github: https://github.com/wenet-e2e/wenet官方中文说明&#xff1a;https://github.com/wenet-e2e/wenet/blob/main/README_CN.md…

分享宠物店微信小程序制作步骤_宠物店管理系统怎么做

大多数人对于动物医疗专业知识比较匮乏&#xff0c;再加上宠物医疗费用&#xff0c;日常用品都略高&#xff0c;宠物店/宠物医院的前景&#xff0c;再未来依旧可观。 相比于实体店&#xff0c;线上平台无疑有着更广阔的拓客渠道和销售前景&#xff0c;做宠物店/宠物医院小程序…

Java进阶(下篇)

Java进阶&#xff08;下篇&#xff09;Java进阶 P387一、IDEA使用与多线程1.概述①idea安装②IDEA常用设置③idea快捷键设置④模板的使用和设置2.程序进程、线程概念3.单核cpu与多核cpu任务执行_ 并行与并发4.多线程优点5.创建多线程方式一&#xff1a;继承Thread类6.线程常用方…

[oeasy]python0078_设置索引颜色_index_color_ansi_控制终端颜色

更多颜色 回忆上次内容 上次 了解了 高亮颜色 91-97 是 高亮 前景色101-107是 高亮 背景色 颜色种类 在原来基础上 增加了一些但也非常有限 还想要 更精细的颜色 有可能吗&#xff1f;&#xff1f;&#x1f914; 更多颜色 继续深挖 关于 逃逸字符的文档 可以用 索引颜色 …

MyBatis源码概述及运行原理解析(篇一)

&#x1f426;MyBatis源码概述及运行原理解析 MyBatis的整体架构分为三层&#xff0c;分别是基础支持层、核心处理层和接口层 &#x1f58c; 中文注释源码Git地址 &#x1f5bd;架构图 &#x1f4c2;源码结构 &#x1f4c1;parsing包 &#x1f5ca;parsing包对应基础支持层中…

Matlab论文插图绘制模板第76期—半对数刻度折线图(Semilogx和Semilogy)

在之前的文章中&#xff0c;分享了Matlab双对数刻度折线图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一下半对数刻度折线图的绘制模板。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系列&#xff0c;旨在降低大家使用Matlab进行科研…

为什么bitnami 安装的软件进入容器,用户名都是I have no name

文章目录背景原因user 参数的缺陷一### user 参数的缺陷二Docker 官方的解决方案背景 在bitnami 安装的软件进入容器用户名都显示I have no name&#xff0c;这是什么原因呢&#xff1f; 原因 在k8中容器默认好像是以uid1001启动的&#xff0c;可以修改该uid docker 启动的时…

leaflet 实现左卷帘效果 (代码示例045)

第045个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中实现左卷帘效果,这里主要引用了leaflet-side-by-side这个插件,直接调用的话,CSS方面有些问题,需要自行调整一下。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配…

目标检测论文阅读:GaFPN算法笔记

标题&#xff1a;Construct Effective Geometry Aware Feature Pyramid Network for Multi-Scale Object Detection 会议&#xff1a;AAAI2022 论文地址&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/19932 文章目录Abstract1. Introduction2. Related Work2.…

探索 Google 的 Bard AI 的强大功能

谷歌最近推出了名为“Bard AI”的新人工智能项目。 该项目旨在改善人工智能的语言和创造力&#xff0c;是谷歌旨在推进人工智能发展的更大“红色代码”计划的一部分。 该项目的主要目标是开发一种可以生成创意写作的语言模型。 什么是巴德人工智能&#xff1f; Bard AI 是一种…

Python 数据库开发实战 - Python与Redis交互篇- 缓存新闻数据至redis

实现新闻缓存功能 - “news_dao.py” - 从数据库提取明确的新闻数据保存至 redis - search_cache() 方法 只有在新闻被管理员审批通过的时候&#xff0c;新闻才可以缓存到 redis 里面。 管理员在 “审批新闻” 的时候是可以获得到 “被审批通过的新闻” 的 id&#xff0c;所以…

Allegro如何用Label Tune功能自动调整丝印到器件中心

Allegro如何用Label Tune功能自动调整丝印到器件中心 在做PCB设计的时候,调整丝印是比较费时的工作,如果需要把整板的丝印位号调整到器件的中心做装配图使用,Allegro的Label Tune功能支持快速把丝印位号居中到器件中心。 以下图为例,快速把所有丝印位号居中 调整前 调整后…

若依框架 --- 偶发的el-select无法选择的问题

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…

RBCD深度利用之“烂番茄”

1.RBCD简介 本篇文章是在基于资源的约束委派的基础上的一个利用&#xff0c;篇幅会比较短&#xff0c;但个人认为利用面还是挺广泛的。于是就写一下。 首先&#xff0c;需要了解的是RBCD的基础知识&#xff1a; 简单回顾一下&#xff1a; 基于资源的约束委派(RBCD) 只支持2…