动态规划优化

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[]的最大值。

就是一个权值的前缀和。

至于求最终的序列,可以平衡树。但是可以倒序,用树状数组即可。

猜你喜欢

转载自www.cnblogs.com/Miracevin/p/9824534.html
今日推荐