96 不同得二叉搜索树 明安图法 动态规划法

给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?

示例:

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

1 3 3 2 1
\ / / / \
3 2 1 1 3 2
/ / \ \

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-binary-search-trees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    int numTrees(int n) {
    	int c=1;
    	for(int i=1;i

这玩意是个公式!!!!!!
叫做

明安图公式!!也叫卡塔兰算法!

上公式!
96 不同得二叉搜索树 明安图法 动态规划法_第1张图片
第一行是最初推理得到得公式,,最后是经过化简得到的

附上公式的证明

最适合理解的模型
n个0和n个1组成一个2n位的2进制数,要求从左到右扫描时,0的累计数始终都小于等于1的累计数,求满足条件的数有多少?

观察模型 (6):在2n位上填入n个0的方案数为 。而从 中减去不符合要求的方案数即为所求答案。
在从左往右扫时,必然会在某一个奇数位2p+1上首先出现p+1个1,和p个0

此后的 [2p+2,2n]上的2n−(2p+1)位有n−p个0, n−p−1个1。如若把后面这部分2n−(2p+1)位的1与0互换,使之成为n−p个1,n−p−1个0,结果得1个由n+1个1和n−1个0组成的2n位数,即一个不合法的方案必定对应着一个由n+1个1和n-1个0组成的一个排列。

可以倒过来反证:
任意一个由n+1个1和n-1个0组成的一个排列,由于1的个数多了2个,且2n为偶数,所以必定在某个奇数位2p+1上出现1的个数超过0的个数。同样把后面部分1和0互换,成为了由n个0和n个1组成的2n位数。

由此,每一个不合法的方案总是与唯一一个由n+1个1和n−1个0组成的排列一一对应。
于是,不合法的方案数就可以写作:

例如 10100101
是由4个0和4个1组成的8位2进制数。但从左而右扫描在第5位(显示为红色)出现0的累计数3超过1的累计数2,它对应于由3个1,5个0组成的10100010。
反过来 10100010
对应于 10100101
因而不合要求的2n位数与n+1个0,n-1个1组成的排列一一对应,故有“卡塔兰数”Catalan
在这里插入图片描述

附上原文链接
https://baike.baidu.com/item/catalan/7605685?fr=aladdin

对于把2p+1后的2n-2p-1位数转换一下我一直无法理解,后来经过兵哥哥的画图,,,才明白
96 不同得二叉搜索树 明安图法 动态规划法_第2张图片

还有许多类似的题目也可以用这种做法,似乎他们都有一些共同的特点。比如只有两种选择可以选
附上一些其他的应用
https://www.cnblogs.com/lsyyy/p/11536606.html
具体是怎样的明晚再深究

另外,这题还可以用动态规划来做,可惜现在还不会,等学完再来做

你可能感兴趣的:(LeeCode)