您的位置:首页 > 其它

151105的测试总结

2015-11-05 15:53 281 查看

第一题

【题目及题号】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)O(n^3)

枚举删除l的左界,然后重新求最长上升序列。

60~70%

方法一

O(n2log2n)O(n^2log_2n)

枚举删除l的左界,然后用nlog2nnlog_2n的方法求最长上升序列(把数列每项依次-i(待验证))。

方法二

O(n2)O(n^2)

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)O(nlog_2n)

类似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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: