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

动态规划优化

时间:2018-10-21 13:10:45      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:规划   目的   动态规划   size   合数   设计   复杂度   维护   树状   

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

就是一个权值的前缀和。

 

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

 

动态规划优化

标签:规划   目的   动态规划   size   合数   设计   复杂度   维护   树状   

原文地址:https://www.cnblogs.com/Miracevin/p/9824534.html

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