动态规划day03

343. 整数拆分(第二次做还是没弄明白)

力扣题目链接(opens new window)

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

示例 1:

  • 输入: 2
  • 输出: 1
  • 解释: 2 = 1 + 1, 1 × 1 = 1。

示例 2:

  • 输入: 10
  • 输出: 36
  • 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
看到题目的第一想法

        dp ,列出最大乘积找规律,发现,按照3来拆分是能达到最大乘积的

        dp[i] 代表最大的乘积

        根据规律进行初始化,将dp[i-3] 与3 相乘

        但我的做法不太符合dp的规律

看到代码随想录之后的想法

        拆分成近似的数时,得到的乘积是最大的

        动规五部曲,很快的写出解题思路

        1确定dp数组以及对应下标的含义

        dp[i] 代表最大的乘积

        2确定递推公式

        dp[i][j] = dp[i-1][j]+dp[i][j-1]

        3dp数组初始化

        需要把第一行和第一列都初始化,都为1

        4确定遍历顺序

        从上往下,从前往后

        5手动推导dp数组

        6打印dp数组

        打印dp[m-1][n-1]

自己实现过程中遇到的困难

        注意初始化

class Solution {
    /*public int integerBreak(int n) {
        //确定dp和每个下标的含义
        //dp的每个下标对应每一个数的最大乘积?
        //确定递推公式
        //5开始,然后3加上对应下标的最大乘积
        //确定dp数组的初始条件
        //dp[0]=1 dp[1]=1 dp[2]=2 
        //确定遍历顺序
        //从前往后
        //举例推导dp数组
        //dp[0]=1 dp[1]=1 dp[2]=2 dp[3]=2 dp[4] =4 dp[5]=6 dp[6]=9 dp[7] = 3*dp[7-3] dp[8]=3+dp[8-3] 
        //打印dp数组
        if(n==2){
            return 1;
        }
        if(n==3){
            return 2;
        }
        if(n==4){
            return 4;
        }
        if(n==5){
            return 6;
        }
        if(n==6){
            return 9;
        }
        int dp[] = new int[n];
        dp[1]=1;dp[2]=2;dp[3]=4;dp[4]=6;dp[5]=9;
        for(int i=6;i<n;i++){
            dp[i]=3*dp[i-3];
        }
        return dp[n-1];
    }*/
    //卡哥做法
    //我的做法的问题,dp的初始值设置的过多,违背的dp的本来含义,有点类似于拆成很多个3的感觉
    //卡哥做法:拆分当前值,存到dp数组中,dp[i] = max(i*(i-j),i*dp[i-j],dp[i]);
    // j*(i-j) 就是当前数拆成两个
    // j*dp[i-j] 就是当前数,和之前dp得到的最大数相乘的最大值,dp[i-j]存放的是拆分i-j所得到的最大值
    // dp[i] 记录就是得到的值动态变化,变化中的最大值就是dp[i] 
     public int integerBreak(int n) {
        //确定dp和每个下标的含义
        //dp的每个下标对应每一个数的最大乘积?
        //确定递推公式
        //dp[i] = max(dp[i],j*(i-j),dp[i-j]*j)
        //确定dp数组的初始条件
        //dp[0]=0 dp[1]=0 dp[2]=1 
        //确定遍历顺序
        //从前往后
        //举例推导dp数组
        //dp[0]=0 dp[1]=0 dp[2] = 1
        //打印dp数组
        if(n==0){
            return 0;
        }
        if(n==1){
            return 0;
        }
        if(n==2){
            return 1;
        }
        int dp[] = new int[n+1];
        dp[0]=0;
        dp[1]=0;
        dp[2]=1;
        //注意是每个下标对应目标的值
        for(int i=3;i<=n;i++){
            //因为拆分一个数n 使之乘积最大,那么一定是拆分成m个近似相同的子数相乘才是最大的。
            //m一定>=2所以只要拆到i/2就行了 ,再往后拆一定不是最大值 
            for(int j=1;j<=i/2;j++){
                dp[i] = Math.max(dp[i],Math.max(j*(i-j),dp[i-j]*j));
            }
        }
        return dp[n];
    }
}

96. 不同的二叉搜索树

(总结时还是不太会)

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

看到题目的第一想法

        dp ,记录种数

        但是没找到规律

看到代码随想录之后的想法

        动规五部曲,很快的写出解题思路

        1确定dp数组以及对应下标的含义

        dp[i] 代表不同的种数

        2确定递推公式

        左子树为0 右子树为n-1 dp[0]*dp[n-1]

        左子树为1 右子树为n-2  dp[1]*dp[n-2]

         左子树为2 右子树为n-3  dp[2]*dp[n-3]

         左子树为3 右子树为n-4   dp[3]*dp[n-4]

        。。。

        左子树为n-1 右子树为0 dp[n-1]*dp[0]

        第n棵树的种数就是把上述的都加起来

        dp[n]=dp[n-1]*dp[0]+dp[n-2]*dp[1]

        for循环0~i 累加起来

        
                //对于第i个节点,需要考虑1作为根节点直到i作为根节点的情况,所以需要累加
                //一共i个节点,对于根节点j时,左子树的节点个数为j-1,右子树的节点个数为i-j
                dp[i]+=dp[j-1]*dp[i-j];

        3dp数组初始化

        dp[0]=1

        4确定遍历顺序

        从前往后

        5手动推导dp数组

        6打印dp数组

        打印dp[m-1][n-1]

自己实现过程中遇到的困难

        注意初始化

        注意是双重for循环 外层0~n 里层0~i

        将根节点编号比较好理解  当根节点为第j个节点时,左边为j-1 右边为 i-jdp[j-1]*dp[i-j]

class Solution {
    //我没想到思路,卡哥给的思路是和正数拆分差不多,也是分为i j 来拆
    //第i棵二叉树的种数为 
    // 左边为i-1*右边为0 dp[i-1]*dp[0]
    // 左边为i-2*右边为1 dp[i-2]*dp[1]
    // 左边为i-3*右边为2 dp[i-3]*dp[2]
    // ... 把以上的相加
    public int numTrees(int n) {
        //确定dp数组以及每个下标的含义
        //当前二叉搜索树的种数
        //确定递推公式
        //dp[i]=dp[i-1]*dp[0]+dp[i-2]*dp[1]+dp[i-3]*dp[2]...
        //dp[i] = for(从j=0开始到i-1dp所记录的相乘)
        //dp数组的初始化
        //空树为0
        //dp[0]=1 dp[1]=1
        //确定遍历顺序
        //从前往后
        //举例推导dp数组
        //dp[0]=0 dp[1] = dp[0]*dp[0] =1 dp[2] = dp[1]*dp[0]+dp[0]*dp[1]=2
        int[] dp = new int[n+1];
        dp[0]=1;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++){
                //如果dp[1]=dp[0]*dp[0]
                //这里是dp[j-1]*dp[i-j]
                // 举例 若i为4
                // 0 3 j=1
                // 1 2 j=2
                // 2 1 j=3
                // 3 0 j=4
                //对于第i个节点,需要考虑1作为根节点直到i作为根节点的情况,所以需要累加
                //一共i个节点,对于根节点j时,左子树的节点个数为j-1,右子树的节点个数为i-j
                dp[i]+=dp[j-1]*dp[i-j];
            }
        }
        return dp[n];
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

植物大战僵尸-C语言搭建童年游戏(easyx)

游戏索引 游戏名称&#xff1a;植物大战僵尸 游戏介绍&#xff1a; 本游戏是在B站博主<程序员Rock>的视频指导下完成 想学的更详细的小伙伴可以移步到<程序员Rock>视频 语言项目&#xff1a;完整版植物大战僵尸&#xff01;可能是B站最好的植物大战僵尸教程了&…

【高等数学之不定积分】

一、什么是不定积分? 我们可以简单地从英文层面来基础剖析一下&#xff0c;什么是不定积分? 1.1、基本概念 小tips: 二、不定积分运算法则 三、常用积分公式 四、第一类换元积分法 4.1、定义 4.2、常用凑微分公式 4.3、小calculate 五、第二类换元积分法 5.1、定义 …

2024年云服务器配置推荐,看看哪家便宜?

作为多年站长使市面上大多数的云厂商的云服务器都使用过&#xff0c;很多特价云服务器都是新用户专享的&#xff0c;本文有老用户特价云服务器&#xff0c;阿腾云atengyun.com有多个网站、小程序等&#xff0c;国内头部云厂商阿里云、腾讯云、华为云、UCloud、京东云都有用过&a…

如何使用宝塔面板部署Inis博客并实现无公网ip环境远程访问

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总…

面试题-DAG 有向无环图

有向无环图用于解决前后依赖问题&#xff0c;在Apollo中用于各个组件的依赖管理。 在算法面试中&#xff0c;有很多相关题目 比如排课问题&#xff0c;有先修课比如启动问题&#xff0c;需要先启动1&#xff0c;才能启动2 概念 顶点&#xff1a; 图中的一个点&#xff0c;比…

shell exit和return的区别

exit和return的区别 exit 可放在shell脚本中任意位置。表示随时结束运行程序的这个进程&#xff0c;并删除进程使用的内存空间&#xff0c;同时把错误信息返回给父进程。 return 是调用堆栈的返回&#xff0c;返回函数值并退出函数&#xff0c;一般用在函数方法体内。 [Ref]…

编译原理-2022期末考试解析

【前言】 这是2022年的期末考试卷&#xff0c;题目还是比较正的&#xff0c;涵盖了词法分析&#xff0c;语法分析&#xff0c;语法制导翻译&#xff0c;优化。从这一年开始&#xff0c;优化的部分分值开始提高&#xff08;这是最后学的部分&#xff09;。 一、词法分析&#xf…

数学经典教材有什么?

有本书叫做《自然哲学的数学原理》&#xff0c;是牛顿写的&#xff0c;读完之后你就会感叹牛顿的厉害之处! 原文完整版PDF&#xff1a;https://pan.quark.cn/s/5d5eac2e56af 那玩意真的是人写出来的么… 现代教材把牛顿力学简化成三定律&#xff0c;当然觉得很简单。只有读了原…

GNSS最终、快速、超快速星历下载地址汇总

GNSS最终、快速、超快速星历下载地址汇总 igs综合产品 ftp://cddis.gsfc.nasa.gov/pub/gps/products GPS单系统 igs 最终产品 igr 快速产品&#xff08;rapid&#xff09; igu 超快速产品&#xff08;Ultra Rapid&#xff09; ftp://cddis.gsfc.nasa.gov/pub/glonass/produc…

从学习投研流程的角度学习Qlib

许多同学只是把Qlib当做一个简单的工具来学习。其实Qlib隐含了一套正规的投研流程&#xff0c;从投研流程的视角去学习Qlib,则不仅能加深对Qlib的理解&#xff0c;而且能够掌握正确的投研流程&#xff0c;哪怕以后不使用Qlib而是使用其他系统了&#xff0c;这套流程还是适用的。…

React之自定义路由组件

开篇 react router功能很强大&#xff0c;可以根据路径配置对应容器组件。做到组件的局部刷新&#xff0c;接下来我会基于react实现一个简单的路由组件。 代码 自定义路由组件 import {useEffect, useState} from "react"; import React from react // 路由配置 e…

基于Springboot的课程答疑系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的课程答疑系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

(25)Linux IPC 进程间通信系统调用:pipe接口

一、进程间通信&#xff08;IPC&#xff09; 1、为什么要进程间通信&#xff1f; 我们在之前讲过 "进程之间是具有独立性" 的&#xff0c;如果进程间想交互数据&#xff0c;成本会非常高&#xff01; 因为独立性之本质即 "封闭"&#xff0c;进程们你封闭…

极客时间-读多写少型缓存设计

背景 内容是极客时间-徐长龙老师的高并发系统实战课的个人学习笔记&#xff0c;欢迎大家学习&#xff01;https://time.geekbang.org/column/article/596644 总览内容如下&#xff1a; 缓存性价比 一般来说&#xff0c;只有热点数据放到缓存才更有价值 数据量查询频率命中…

2000-2021年全国各省环境相关指标数据(890+指标)

2000-2021年全国各省环境相关指标数据&#xff08;890指标&#xff09; 1、指标时间&#xff1a;2000-2021年 2、范围&#xff1a;31省市 3、来源&#xff1a;2001-2022年环境统计年鉴 4、指标&#xff1a;工业废水排放总量、工业废水排放达标量、工业废水处理量、化学需氧…

golang 生成一年的周数

// GetWeekTimeCycleForGBT74082005 获取星期周期 中华人民共和国国家标准 GB/T 7408-2005 // 参数 year 年份 GB/T 7408-2005 func GetWeekTimeCycleForGBT74082005(year int) (*[]TimeCycle, error) {var yearstart time.Time //当年最开始一天var yearend time.Time //当年…

Python知识点(史上最全)

Python期末考试知识点&#xff08;史上最全&#xff09; python简介 Python是一种解释型语言 Python使用缩进对齐组织代码执行&#xff0c;所以没有缩进的代码&#xff0c;都会在载入时自动执行 数据类型&#xff1a;整形 int 无限大 浮点型 float…

Javaweb之SpringBootWeb案例开发规范的详细解析

1.2 开发规范 了解完需求也完成了环境搭建了&#xff0c;我们下面开始学习开发的一些规范。 开发规范我们主要从以下几方面介绍&#xff1a; 1、开发规范-REST 我们的案例是基于当前最为主流的前后端分离模式进行开发。 在前后端分离的开发模式中&#xff0c;前后端开发人员…

Vue3 父事件覆盖子事件,Vue2 的 v-on=“$listeners“ 的替代方案

在 Vue3 中&#xff0c;$listeners 被删除 子组件代码&#xff0c;需要特别注意的是事件名为 on 开头&#xff0c;例如 onBack。不确定的可以通过给父组件传递 事件或属性&#xff0c;再打印子组件的 attrs useAttrs()&#xff0c;来确定传值 // template v-bind"newA…

Netty-Netty组件了解

EventLoop 和 EventLoopGroup 回想一下我们在 NIO 中是如何处理我们关心的事件的&#xff1f;在一个 while 循环中 select 出事 件&#xff0c;然后依次处理每种事件。我们可以把它称为事件循环&#xff0c;这就是 EventLoop 。 interface io.netty.channel. EventLoo…
最新文章