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留在之后没有任何用处,所以现在删除也可以,于是我们直接现在删除

posted @   最爱丁珰  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示