动态规划day03

news2024/11/19 19:37:21

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.coloradmin.cn/o/1375544.html

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

相关文章

了解特权身份管理(PIM)的基础知识

要了解特权身份&#xff0c;首先必须确定身份是什么&#xff0c;管理员可用于验证属于网络的用户的真实性的任何形式的唯一身份验证都是身份&#xff0c;这些包括密码、用户名、员工 ID、手机号码、安全答案等。 这些身份通常存储在 Active Directory 等目录中&#xff0c;并使…

EM planner 论文阅读

论文题目&#xff1a;Baidu Apollo EM Motion Planner 0 前言 EM和Lattice算法对比 EM plannerLattice Planner参数较多&#xff08;DP/QP&#xff0c;Path/Speed&#xff09;参数少且统一化流程复杂流程简单单周期解空间受限简单场景解空间较大能适应复杂场景适合简单场景 …

【分布式技术】rsync远程同步服务

目录 一、rsync&#xff08;远程同步&#xff09; 二、实操rsync远程文件同步 准备一个服务端192.168.20.18以及一个客户端192.168.20.30 1、服务端搭建&#xff1a;先完成服务端配置&#xff0c;启动服务 rsync拓展 1、关于rsyncd服务的端口号 2、rsync和scp的区别 2、测…

企业级进销存管理系统

框架&#xff1a; 进销存管理系统&#xff0c;采用SpringBootShiroMyBatisEasyUI 项目采用Maven构建&#xff0c;数据库文件存放在 sql/jxc.sql 截图 运行项目部分截图&#xff0c; 登录界面&#xff0c;用户名admin&#xff0c;密码admin123 当前库存查询&#xff0c; 进…

UI自动化测试工具对企业具有重要意义

随着软件行业的不断发展&#xff0c;企业对高质量、高效率的软件交付有着越来越高的要求。在这个背景下&#xff0c;UI自动化测试工具成为了企业不可或缺的一部分。以下是UI自动化测试工具对企业的重要作用&#xff1a; 1. 提高软件质量 UI自动化测试工具能够模拟用户的操作&am…

《堆排序》与《Top—k》

目录 ​编辑 前言&#xff1a; 关于《堆排序》&#xff1a; 第一步&#xff1a;建堆 第二步&#xff1a;排序 《Top—K问题》 关于Top—k问题&#xff1a; 前言&#xff1a; 我们在前面的blog中&#xff0c;对于《堆》已经有了初步的概念&#xff0c;那么接下来我们可以…

mapper向mapper.xml传参中文时的乱码问题

1.起因&#xff1a; 在idea中进行模糊查询传参时&#xff0c;发现在idea中查中文查不出记录&#xff0c;在navicate中可以查出来。 2.猜测&#xff1a; 1.idea中的编码问题导致的乱码。 2.idea和navicate的编码一致性导致的乱码。 3.mapper向mapper.xml传参后出现乱码。 3.解…

Transformer从菜鸟到新手(六)

引言 上篇文章介绍了如何在多GPU上分布式训练&#xff0c;本文介绍大模型常用的一种推理加速技术——KV缓存。 KV Cache KV缓存(KV Cache)是在大模型推理中常用的一种技巧。我们知道在推理阶段&#xff0c;Transformer也只能像RNN一样逐个进行预测&#xff0c;也称为自回归。…

IPv6路由协议---IS-ISv6

IS-ISv6概述 中间系统到中间系统IS-ISv6(Intermediate System to Intermediate System)属于内部网关协议IGP(Interior Gateway Protocol),用于自治系统内部。IS-IS也是一种链路状态协议,使用最短路径优先SPF(Shortest Path First)算法进行路由计算。 IS-ISv6产生 IS…

代码随想录刷题笔记(DAY 10)

今日总结&#xff1a;快要期末考试了&#xff0c;现在在疯狂速成&#xff0c;今天稍微缓和了一点&#xff0c;应该能保证继续每天刷题&#xff0c;欠下的那些寒假补上。 Day 10 01. 用栈实现队列&#xff08;No. 232&#xff09; 题目链接 代码随想录题解 1.1 题目 请你仅…

Deep Reinforment Learning Note 1

文章目录 Terminology Terminology st : stateot : observationat : action π θ ( a t ∣ o t ) \pi_\theta (a_t | o_t) πθ​(at​∣ot​) : policy π θ ( a t ∣ s t ) \pi_\theta (a_t | s_t) πθ​(at​∣st​) : policy (fully observed) Observation result from…

[软件工具]pdf多区域OCR识别导出excel工具使用教程

首先我们打开软件&#xff0c;界面如下&#xff1a; 如上图&#xff0c;使用非常简单&#xff0c;步骤如下&#xff1a; &#xff08;1&#xff09;选择工具-取模板选择一个pdf文件划定自己需要识别的区域&#xff0c;如果你选择第2页指定区域则软件统一识别所有pdf第2页指定区…

线性表入门

王有志&#xff0c;一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群&#xff1a;共同富裕的Java人 从今天开始就进入到数据结构的部分了&#xff0c;整体分为3个部分&#xff1a;线性表&#xff0c;树和图&#xff0c;从认识每种数据结构到它们的高级应用。今天我们先…

如何从 Keras 中的深度学习目录加载大型数据集

一、说明 数据集读取&#xff0c;使用、在磁盘上存储和构建图像数据集有一些约定&#xff0c;以便在训练和评估深度学习模型时能够快速高效地加载。本文介绍Keras 深度学习库中的ImageDataGenerator类等工具自动加载训练、测试和验证数据集。 二、ImageDataGenerator加载数据集…

Bom 和 Dom 区别 ----- 真是DOM 和 虚拟Dom区别

DOM和BOM的区别 我们都指代&#xff0c;javascript由三个部分组成&#xff1a; ECMAScript&#xff1a;描述了JS的语法和基本对象 BOM(浏览器对象)&#xff1a;与浏览器交互的方法和对象 DOM(文档对象模型)&#xff1a;处理网页内容的方法和接 ps&#xff1a;根据宿主&#x…

数学经典教材有什么?

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

并发前置知识一:线程基础

一、通用的线程生命周期&#xff1a;“五态模型” 二、java线程有哪几种状态&#xff1f; New&#xff1a;创建完线程Runable&#xff1a;start(),这里的Runnable包含操作的系统的Running&#xff08;运行状态&#xff09;和Ready&#xff08;上面的可运行状态&#xff09;Blo…

单片机中的PWM(脉宽调制)的工作原理以及它在电机控制中的应用。

目录 工作原理 在电机控制中的应用 脉宽调制&#xff08;PWM&#xff09;是一种在单片机中常用的控制技术&#xff0c;它通过调整信号的脉冲宽度来控制输出信号的平均电平。PWM常用于模拟输出一个可调电平的数字信号&#xff0c;用于控制电机速度、亮度、电压等。 工作原理 …

2024,智能座舱不要再过度“装修”了!

文 | AUTO芯球 作者 | 雷慢 还记得2022年小鹏疲劳驾驶检测系统将小眼睛驾驶员识别为“开车睡觉”吗&#xff1f;驾驶员被扣了“智驾分”&#xff0c;你没听错&#xff0c;车主不光要焦虑驾照扣分的时候&#xff0c;还要焦虑被车子扣分。 雷慢还记得另一个奇葩事情是某问界车主…

S7-200SMART实例之冒泡法排序子程序

需求分析 编写程序实现冒泡法排序的算法。 冒泡法排序是一种简单的排序算法。因其过程如同水中气泡最终会上浮到水面一样&#xff0c;故被形象地称为“冒泡法排序”。 实现原理 根据以上需求分析可以按以下步骤实现算法&#xff1a; 1.比较相邻的元素。如果第一个比第二个…