01 Tree
有利用数学归纳法思想的扩展法,就有反过来的删除法,这里利用删除法
考虑对于一颗合法的树,显然删除某两个叶子,会让其共同父亲变成叶子,这就形成了一个递归的过程;而某两个叶子在序列\(a\)中也一定是相邻的,而且很容易发现特征,就是其\(a\)的大小相差\(1\)
但是现在的问题就是我们不知道删除哪两个相差\(1\)的相邻的\(a\),因为满足相差\(1\)的相邻的\(a\)有很多,这个时候我们就考虑特殊元素,考虑\(a\)最大的元素,显然其父亲的另一个节点也一定是叶子节点(否则如果另一个节点还有子孙,就与这个元素的\(a\)最大相矛盾),于是就可以删除这两个元素(当然要满足删除的前提条件,就是其相邻的\(a\)要比其小\(1\))并且向序列中添加一个\(a\)值为较小元素的元素,就形成了一个子问题;注意可能\(a\)最大的元素左边和右边的元素都比其小\(1\),这个时候无论删除谁都可以,得到的新的\(a\)序列都长成一个样子
update 2024.9.4
想到考虑特殊元素了,但是却没有考虑最大的,只考虑最小的,哎
其实上面的过程证明有点伪,\(a\)最大的元素的父亲的另一个节点不一定是叶子节点;这里应该用贪心法来证明:如果有解,那么我们一定可以找到一个最大的元素,其父亲的领一个节点也是叶子节点(尽管我们不能确定是哪一个最大的元素);合并这个节点与其兄弟,会发现就是删除这个节点;于是如果有解,我们合并的过程一定为每次删除数列中的最大数(尽管我们不知道删除的顺序),要求这个最大数的邻居至少有一个只比其小一;我们考虑当前数列中可删除的最大数\(x\),无论在什么时候,数列中的元素都不会因为\(x\)的原因才能被删除,也就是说\(x\)留在之后没有任何用处,所以现在删除也可以,于是我们直接现在删除

浙公网安备 33010602011771号