状态优化
bzoj2064 分裂
存在通解:把原始集合都合并,再一一拆开。
如果可以划分一些集合,使得原始集合和目标集合对应的小集合相等,那么可以节省操作次数。
ans=(n1-1)+(n2-1)-2*(x-1) x为划分的相同集合数。
n<=10,状压
另外,其实原始集合一个x,就是往右x步,目标集合一个y,就是往左y步。
那么,两个个集合对应和相等,就是走出去再回来、
f[S1][S2]表示,原始集合选择S1的元素,目标集合选择S2元素,最多可以凑成几个和相等的集合。也即能走多少个圈。
预处理集合对应的和。
转移枚举选择哪个元素(原始或者目标)2n复杂度。
枚举状态2^2n
所以,O(20*2^20)
性质优化:
bzoj3173[TJOI2013]最长上升子序列
题目的特点是,从1~N从小到大加入。
当然可以平衡树动态维护,但是不够优美。
回忆LIS的状态设计,f[]以i结尾LIS
那么,对于一个x,比x大的y一定不会出现在f[x]的方案中。
所以,我们可以把最终的序列求出来,然后求f[1~n]
然后,逆序输出,ansi,就是对权值为1~i的位置求f[]的最大值。
就是一个权值的前缀和。
至于求最终的序列,可以平衡树。但是可以倒序,用树状数组即可。
数据结构优化:
二维树状数组