本文主要是介绍【代码随想录训练营】【Day 43】【动态规划-3】| Leetcode 343, 96,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【代码随想录训练营】【Day 43】【动态规划-3】| Leetcode 343, 96
需强化知识点
- 思路:343 and 96
题目
343. 整数拆分
- dp 含义:拆分i,乘积最大值;依次遍历 i的因子,记录最大值,max(之前的因子,两两拆分的情况,多次拆分的情况)
class Solution:def integerBreak(self, n: int) -> int:# 拆分i,乘积最大值dp = [1] * (n+1)for i in range(2, n+1):for j in range(1, i+1):dp[i] = max(max( j * (i-j), dp[j] * (i-j)), dp[i])return dp[n]
96. 不同的二叉搜索树
- 代码随想录思路
- dp 的含义:1到i为节点组成的二叉搜索树的个数为dp[i];
- 递推公式:dp[i] += dp[j - 1] * dp[i - j]; ,j-1 为 j 为头结点左子树节点数量,i-j 为以 j 为头结点右子树节点数量,依次累加(此处只需要考虑种类数,因此可以直接使用,dp[i - j], 因为数字的大小排序情况是等价的)
- 注意初始值的赋予:因为此处是累加,不能都赋值为1
class Solution:def numTrees(self, n: int) -> int:# 1到i为节点组成的二叉搜索树的个数为dp[i]。dp = [0] * (n + 1)dp[0], dp[1] = 1, 1for i in range(2, n+1):for j in range(1, i+1):dp[i] += dp[j-1] * dp[i-j]return dp[n]
这篇关于【代码随想录训练营】【Day 43】【动态规划-3】| Leetcode 343, 96的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!