动态规划基础——dp五部曲模板(三)

简介: 动态规划基础——dp五部曲模板(三)

7. 不同的二叉搜索树(LeetCode-96)


题目

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


示例 1:



输入:n = 3
输出:5


示例 2:

输入:n = 1
输出:1


提示:


1 <= n <= 19


思路

这里用代码随想录的图分析一下


n = 1



n = 2



n = 3



可以分3种情况


1.元素1为头结点时,没有比1小的元素了,所以左子树为空,右子树元素个数为二,就有 dp[2] 种组合。为什么是 dp[2] 种,题目不是说是由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种吗?这里呢其实大家要明白 dp[i] 的含义,也就是先定dp数组——i 个不同元素节点组成的互不相同的二叉搜索树有 dp[i] 种。我这里去掉了节点值从 1 到 n ,因为对于元素个数为2的二叉搜索树来说,无论它的元素值是 1 , 2  还是 2 , 3,排列组合的结果都是一样的!

2.元素2为头结点时,左子树元素个数为一,右子树元素个数也为一

3.元素3为头结点时,左子树元素个数为二,右子树元素个数也为零

4.所以 d p [ 3 ] = d p [ 2 ] ∗ d p [ 0 ] + d p [ 1 ] ∗ d p [ 1 ] + d p [ 0 ] ∗ d p [ 2 ]

五部曲


1.dp[i] 含义: i 个不同元素节点组成的互不相同的二叉搜索树有 dp[i] 种


2.变量 j 从 0 遍历至 i-1 ,dp[i] 初值为零

d p [ i ] = d p [ i ] + d p [ j ] ∗ d p [ i − j − 1 ]

3.dp[0]=1 从定义上来讲,空节点也是⼀颗⼆叉树,也是⼀颗⼆叉搜索树


4.节点数为i的状态是依靠 i之前节点数的状态,所以从前往后


5.测试用例

代码展示

class Solution
{
public:
    int numTrees(int n)
    {
        vector<int> dp(n + 1);
        dp[0] = 1;
        for (int i = 1; i <= n; i++)
        {
            for (int j = 0; j < i; j++)
            {
                dp[i] += dp[j] * dp[i - j - 1];
            }
        }
        return dp[n];
    }
};


8. 小结


卡尔哥的方法是真的好用,写dp代码没多少,主要是五部曲写出思路。代码随想录yyds!

目录
相关文章
|
Unix Linux 数据安全/隐私保护
百度搜索:蓝易云【什么是 sudo,为什么它如此重要?】
总而言之,sudo在Linux和Unix系统中扮演着重要的角色,它通过提供临时的超级用户权限,实现了对系统资源和操作的严格控制。它提高了系统的安全性,允许细粒度的权限管理,并提供了审计特权操作的能力。使用sudo可以有效地平衡用户便利性和系统安全性之间的关系。
433 0
|
JSON 前端开发 Java
template might not exist or might not be accessible by any of the configured Template Resolvers
template might not exist or might not be accessible by any of the configured Template Resolvers
585 0
|
机器学习/深度学习 人工智能 运维
自动化运维的利与弊:探索现代IT管理的双刃剑
在数字化浪潮不断推进的时代,自动化运维作为提升效率、降低人力成本的重要手段,已成为众多企业追求的目标。然而,正如一枚硬币有两面,自动化运维同样蕴含着利益与风险的双重属性。本文将深入探讨自动化运维在简化流程、提升响应速度的同时,可能带来的依赖性增强、安全漏洞增多等问题,并就如何在享受自动化红利的同时有效规避潜在风险提出建议。
260 0
|
安全 API 数据库
Django/Flask不只是框架,它们是你Web开发路上的超级英雄!
【7月更文挑战第14天】Django与Flask,Python Web开发的双雄。Django提供全面功能,如ORM、模板引擎,适合大型项目;Flask轻量灵活,适用于快速迭代的定制化应用。Django示例展示ORM简化数据库操作,Flask示例演示构建RESTful API的便捷。两者各有所长,为开发者创造无限可能。**
139 0
userdel 删除用户
userdel 删除用户。
120 6
|
前端开发
伪类是什么
伪类是什么。
83 1
|
PyTorch 算法框架/工具
【Pytorch写代码技巧--Einsum】Einsum详解+常用写法
不知大家在看论文代码的时候是否会常常看见 torch.einsum(),这玩意儿看起来是真的抽象,但是深入了解后发现它原来这么好用。
984 0
|
存储 算法 数据中心
基于蓄电池进行调峰和频率调节研究【超线性增益的联合优化】(Matlab代码实
基于蓄电池进行调峰和频率调节研究【超线性增益的联合优化】(Matlab代码实
108 0
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
|
存储 前端开发 安全
云开发实战 | 学习笔记
简介:快速学习云开发实战
385 0
云开发实战 | 学习笔记