【noi2009 二叉搜索树】动态规划

神奇的二叉树出现往往意味着神奇的性质,这题也不例外

题目悄悄地告诉了我们treap是干什么的,可是我惊奇地发现本题与平衡树的使用没有一点关系

哎,乖乖地动归吧,别乱想,孩子

经验告诉我们,二叉树往往能利用中序遍历序列转化为线性结构

这题就比较明显了,二叉搜索树,摆明了就是一个数据值从小到大的序列嘛,好了,按数据值排好序后做区间型dp想

我不一会儿便想到一个白痴n^3的方程,大概就是f[i,j]表示i到j这一段的最小花费,每次考虑枚举一个为根,再根据权值看把这个点提为根要不要多算花费

十分得意地过了样例,一测,结果可想而知的就是0分 T_T

怎么错了?陷入深深地思考中。首先很容易从心理学的角度判断出我这个算法应该是错的,n^3的方程数据没理由n<=70

科学是严谨的,我究竟怎么错了?再作深入分析

我这样做实际上是考虑了把一个点的权值改 小 ,而实际上我们可以把一个点改小还可以改 大 !

这个的方程完全考虑不到这种情况,错误便在这里!

再感性地想一想,也确实是,有时候是有把一个点提上来没有把另一个点沉下去的好的可能的。

那么,怎么改改方程才能消掉这个后效呢?

增维?没错!就是增维,考虑到权值的后效,我们把权值这一维设进方程就可以了

把权值先离散化掉,记f[i,j,k]表示i到j这一段的子树权值全部>=k的最小花费

那么需要枚举一个u为根,我们可以把u的权值改为k,那u的子树f[i,j,k]=f[i,u-1,k]+f[u+1,j,k]+s[i..j];而如果u的权值本身就>=k啦,

f[i,j,k]就还可以从f[i,u-1,b[i]]+f[u+1,j,b[i]]+s[i..j]转移过来(b[i]就是i的权值)

边界就是f[i,i-1,k]=0,答案就是f[1,n,0]

这个方程还是有一点是需要解释的,可能你也感觉到了,题目不是说要根的权值小于儿子权值吗?你这里是小于等于啊,难道不会萎?

事实确实没有萎,就凭这个方程ac了,怎么理解呢?

题目还说你可以把权值改成任意实数,意思就是你想让哪个点处于哪个位置就可以让它处于哪个位置

那么实际上我们可以看成根的权值改成比k略大一点点,这样就可以了

 

代码:

一开始意识流地以为如果u点的权值>=k就只有第二种转移了,样例调了半个小时才发现。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值