标签: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 属性 考试 滚动 计数 方法 相同 问题 边界问题
原文地址:https://www.cnblogs.com/Hikigaya/p/11736068.html