day41|动态规划3-整数拆分&不同二叉搜索树

文章探讨了使用动态规划解决两个问题:一是整数拆分,目标是找到使乘积最大的拆分方法;二是不同的二叉搜索树,计算特定数量节点能构建的不同搜索树的数量。通过定义dp数组和递推公式,对每个问题进行了详细的解析和代码实现。
摘要由CSDN通过智能技术生成

动态规划问题需要找到后一个问题关联的前一个或前几个子问题,在整数拆分问题中,后一个整数的拆分由前面整数的拆分决定。在不同二叉搜索树问题中,拆分一个二叉树,依赖于当前的根节点可以拆分出多少搜索二叉树。

343. 整数拆分

动归五部曲:

  1. dp[i]:i被拆分的最大乘积
  2. dp数组初始化:
  3. 遍历方式:
  4. 递归函数:dp[i] = max(dp[i],max(j*(i-j),j*dp[i-j]))
  5. 打印dp数组
class Solution:
    def integerBreak(self, n: int) -> int:
        # 原则:拆分一个数n 使之乘积最大,那么一定是拆分成m个近似相同的子数相乘才是最大的
        # dp算法的五步曲:dp数组的初始化,递推公式,dp数组下标的含义
        dp = [0] * (n+1)
        dp[0] = 1
        dp[1] = 1
        dp[2] = 1
        for i in range(3,n+1):
            for j in range(1,i):
                dp[i] = max(dp[i],max(j*(i-j), j*dp[i-j]))
            print(dp)
        return dp[n]

96.不同的二叉搜索树

  1. dp[i]: 1到i为节点组成的二叉搜索树的个数为dp[i]。
  2. 递推公式: dp[i] += dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量]

本题与前几道题目不太一致的地方在于,本题在递归函数的选取上更加复杂,需要乘积和累加的形式。

  1. dp数组初始化:dp[0]=1
  2. 遍历顺序从前往后
  3. 打印dp数组进行测试
class Solution:
    def numTrees(self, n: int) -> int:
        dp = [0]*(n+1)
        dp[0] = 1
        for i in range(1,n+1):
            for j in range(1,i+1):
                dp[i] += dp[j-1] * dp[i-j]
        print(dp)
        return dp[n]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值