集合挑选
从给定的N个集合中各挑出一个数并求和,求出前K大的K个和。
考虑如何从2个集合A,B中选出前K大。降序排序后a1和b1显然是最大,第二大则是(a1,b2)或者(a2,b1)。不妨以(a1,b2)来讲,那么第三大竞争者除(a2,b1)还有(a1,b3),(a2,b3)……每对组合都能找到直接小于它的2个组合,而这种后继关系显然取遍了所有组合。仅需要前K大的我们按需扩展这一棵树即可。2个集合的前K大可与第3个集合执行相同的操作,从而得到最终答案。实际编写时,按照一定顺序限制扩展方向来保证每个方案仅访问一次,使用优先队列维护,复杂度为O(∑NKlognk)≤O(KN)
LIS优化
f(i)=max{f(j)∣j<i,a(j)<a(i)}+1
可以发现,一旦有a(k)<a(j),f(k)≥f(j),j这个位置就没有用了。按照该规律维护一个单调栈记录,以长度单调(则数字a结尾的LIS自然单调)。此后转移