动态规划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]=2int[] 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-jdp[i]+=dp[j-1]*dp[i-j];}}return dp[n];}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(4)员工管理|修改员工、配置文件

指路&#xff08;1&#xff09;&#xff08;2&#xff09;&#xff08;3&#xff09;&#x1f447; 黑马程序员JavaWeb开发|案例&#xff1a;tlias智能学习辅助系统&#xff08;1&#xff09;准备工作、部门管理_tlias智能学习辅助系统的需求分析-CSDN博客https://blog.csdn.n…

AI人工智能的发展趋势及未来展望

人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;作为一门拥有悠久历史但最近才得到广泛关注的领域&#xff0c;正在以惊人的速度推动着科技进步和社会变革。近年来&#xff0c;随着计算能力、数据规模和算法研究的不断突破&#xff0c;人工智能已经…

java通过HttpClient方式实现https请求的工具类(绕过证书验证)

目录 一、引入依赖包二、HttpClient方式实现的https请求工具类三、测试类 一、引入依赖包 引入相关依赖包 <!--lombok用于简化实体类开发--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><option…

MySQL批量插入技巧

关于MySQL批量插入的一些问题 MySQL一直是我们互联网行业比较常用的数据&#xff0c;当我们使用半ORM框架进行MySQL大批量插入操作时&#xff0c;你是否考虑过这些问题: 进行大数据量插入时&#xff0c;是否需要进行分批次插入&#xff0c;一次插入多少合适&#xff1f;有什么…

泡泡玛特台北旗舰店打造“乐园式体验”,打造西门町新地标

近日&#xff0c;泡泡玛特台北旗舰店盛大开业&#xff0c;矗立于西门町核心商圈的壮观五层独栋建筑吸引大量游客驻足。作为年度收官之作&#xff0c;该店总面积700多平方米&#xff0c;售卖超过千款潮玩。各楼层经过精心规划&#xff0c;除了各大IP最新款潮玩产品及衍生品之外&…

[蓝桥杯学习] 树状树组

lowbit操作 数字二进制表达中的最低位1以及后面所有的0&#xff0c;函数写法如下&#xff1a; int lowbit(int x){return x&-x;} 例如说&#xff0c;lowbit(0101100100) (100) lowbit(4) 4 lowbit(6) 2 时间复杂度o(1) 树状数组 应用 进行单点修改和区间查询…

第 378 场 LeetCode 周赛题解

A 检查按位或是否存在尾随零 枚举&#xff1a;枚举两个元素的组合即可 class Solution { public:bool hasTrailingZeros(vector<int> &nums) {int n nums.size();for (int i 0; i < n; i)for (int j 0; j < i; j)if ((nums[i] | nums[j]) % 2 0)return tru…

平面光波导_三层均匀平面光波导_射线分析法

平面光波导_三层均匀平面光波导_射线分析法 三层均匀平面光波导&#xff1a; 折射率沿 x x x 方向有变化&#xff0c;沿 y y y、 z z z 方向没有变化三层&#xff1a;芯区( n 1 n_1 n1​) > > > 衬底( n 2 n_2 n2​) ≥ \geq ≥ 包层( n 3 n_3 n3​)包层通常为空…

【排序算法】四、堆排序(C/C++)

「前言」文章内容是排序算法之堆排序的讲解。&#xff08;所有文章已经分类好&#xff0c;放心食用&#xff09; 「归属专栏」排序算法 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 堆排序1.1 原理1.2 堆的向下调整1.3 堆排序代码实现1.3 性质总结 堆排序 1.1 原理 概念介…

推荐一下最近在看到比较好的小报童

最近订阅了很多优秀的小报童 说真的&#xff0c;在知识付费领域&#xff0c;小报童是一个弟弟&#xff0c;但是这种模式却非常棒 轻量级交付&#xff0c;靠口碑传播 这对于想进入知识付费领域&#xff0c;但是又不想重交付的人来说&#xff0c;确实是一个很好的平台 下面推…

git 中的概念

git 中的概念 在使用 Git 版本控制的过程中&#xff0c;有些概念我们必须有所了解&#xff0c;这样才能更有效率也更有意义的学下去。 有清楚且正确的概念认知&#xff0c;不但有助于我们学习如何操作 Git 命令&#xff0c;更重要的是&#xff0c;学习 Git 的相关知识也会更加…

【【ZYNQ基础模块串口的意义】】

ZYNQ基础模块串口的意义 ZYNQ的配置介绍 如此纯粹的引脚显示 DDR 用来接DDR FIXED_IO 主要用来调试 现在一步一步配置出PS与PL端想沟通的zynq核 第一步给PL端添加一个时钟 因为 PS 与 PL端的时钟晶振不一样 我们可以通过一个PLL 来帮助我们生成想要实现的PL端时钟 第二步…