第一题
【题目及题号】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%
枚举删除l的左界,然后重新求最长上升序列。
60~70%
方法一
枚举删除l的左界,然后用
方法二
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%
类似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。