码迷,mamicode.com
首页 > 其他好文 > 详细

CSP-S 模拟 R2D2 总结

时间:2019-10-25 10:22:11      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:csp   属性   考试   滚动   计数   方法   相同   问题   边界问题   

额。。。

T1是构造题,画出一棵树然后开始想,可以考虑黑白染色,黑点刚进栈就输出,白点出栈再输出,跳3条边的情况就是从一个点的一个子树跳到另一个的情况。

启发:对于这种构造题,先考虑什么时候可以简单操作(跳两边),什么时候必须用较复杂的操作(跳三边),这样思路就会清晰,写起来也就明了了。

复杂度:\(O(n)\)

T2。。。一直写费用流写挂了。。。

T2可以考虑 dp,由于每个人有3个属性,注意到组长要比组员经验大,所以我们可以排序,这样就可以维护 2 个属性了,然后剩下的费用可以 dp 处理,然后状态为考虑到 i 人时,选了 j 组,另外还有 l 个组员时的状态,注意到 n 与 k 的关系,可以知道状态不算大,然后还可以滚动数组维护(填表比刷表更好,因为由于滚动了,所以刷表的话要初始化,而填表不用)然后就是要注意 dp 边界问题。

这种问题一定要排序考虑,想不出贪心就去 dp(我考试时竟然一点没去想 dp。。。)

复杂度:\(O(nk^2)\)

T3

就相当于处理字典序的问题。

有 2 种情况:

1.\(s>t\) 这是统计每种长度的s不同本质的子序列即可

2.\(s==t\) 注意到若一组子序列 A 比 B 大,那么 A 拓展出的就一定也比 B 拓展的大,于是可以考虑求 g[i][j] 表示 以 i 和 j 结尾的子序列中刚开始 \(a[i]>b[j]\) 的本质不同子序列数,然后要求这,就要求 f[i][j] 表示以 i 和 j 结尾的子序列中相同的本质不同的子序列数(有点说不太明白。。。),然后可以求出 g,进而可以求出 h[i][j] 表示以 i 和 j 结尾的子序列中满足 \(a[i]>b[j]\) 的本质不同的子序列数,可以通过 g 与 h 来求。(然后感觉好像求 g 没啥必要?)

然后就是处理时可以前缀和优化,再就是不要算重了,方法是记录 p[i] 表示 i 前一次出现 a[i] 的位置,由于定义都是从哪结尾的,所以 p[i] 之前的都可以转移到 p[i] 上,就不用转移到 i 上了。

复杂度:\(O(n^2)\)

感觉周末得把之前的几道计数题和 dp 的总结写了。。。

CSP-S 模拟 R2D2 总结

标签:csp   属性   考试   滚动   计数   方法   相同   问题   边界问题   

原文地址:https://www.cnblogs.com/Hikigaya/p/11736068.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!