151105的测试总结

12 篇文章 0 订阅
4 篇文章 0 订阅

第一题

【题目及题号】path superoj1005
【题解】
题意就是给出中序遍历和先序遍历求二叉树。
中序遍历为123456……
那么对于先序遍历的第一个是整棵树的根,然后编号比他小的都在左边,大的都在右边。
然后递归下去做它的左子树即可。
【注意事项】
传参数的时候一定要想清楚,调了快半个小时Orz。

第二题

【题目及题号】wolf superoj1006
【题解】
40%
暴力搜索(状压)枚举先杀掉哪一个即可。
100%
区间Dp,f[i][j]表示消灭i~j的狼最少需要花费的代价。
那么f[i][j] = f[i][k-1]+f[k+1][j]+a[k]+b[k-1]+b[k+1];取min即可;
第一维枚举长度,第二维枚举左界,第三维枚举k即可。
可以递归实现,递推也很好写。
【注意事项】
区间DP Orz。感谢大神让我发现了这个洞。

第三题

【题目及题号】seq superoj1007
【题解】
30%
O(n3)
枚举删除l的左界,然后重新求最长上升序列。

60~70%
方法一
O(n2log2n)
枚举删除l的左界,然后用 nlog2n 的方法求最长上升序列(把数列每项依次-i(待验证))。
方法二
O(n2)
f[i][0]表示到第i个数,前面没有出现过l段删除的数;
f[i][1]表示到第i个数,前面出现过l段删除的数。
f[i][0] = max f[j][0] (a[i]>a[j])
f[i][1] = max f[j][1] (a[i]>a[j]) f[j][0] (a[i]>a[j] && j < i-l)

100%
O(nlog2n)
类似70%的方法二,只是用数据结构维护。
把f[i][0]的值根据a[i]丢到线段树A(a[i]+1,cnt)里维护max;
把f[i][1]的值根据a[i]丢到线段树B(a[i]+1,cnt)里维护max;
到i的时候还要把f[i-l-1][0]丢到线段树B中;
然后A中询问a[i]即可更新f[i][0];
同理维护f[i][1];
【注意事项】
因为我取l的时候是对i取开,所以最后要记录到n+1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值