dp:各种优化☺☺
文章平均质量分 92
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
2016 UESTC Training for Dynamic Programming J - 柱爷抢银行II dp单调队列优化
dp单调队列优化 dp[i] = sum[i] - sum[que.front()]; , i-k<=j<i 用deque(自己写了个双端队列写挂了(┬_┬),应该收藏个版) 来记录队列中元素的下标, 队首为当前最小值 1.如果队首元素的位置距离当前位置 > k,队首出队 2.dp[i]=sum[i] - sum[que.front()] 3.所有大于sum[i]的队尾元素出队,sum[i]入队 所有前缀和只出入队一次,所以时间复杂度为O(N)原创 2016-05-17 12:04:13 · 1383 阅读 · 2 评论 -
2016 UESTC Training for Dynamic Programming L - 柱爷抢银行MkⅣ dp 线段树优化
dp 线段树优化 dp[i] = max(dp[j]) + v[i] // x[i] – y[i] <= x[j] < x[i] 首先按x[i]升序排序 用线段树优化时间,单点更新,区间查询 x[i],y[i]<=1e9, 需要离散化 max(dp[j]) = dpj = Query(l, r); 算出以后更新进去Modify(x, dp[i]);, 这样一次插入进去 当考虑dp[i]的时候里面必然是1 - i-1 是插入的, 因此满足只能从较小号数的银行才能到达较大号数的银行 复杂度 O(NLogN)原创 2016-05-17 12:09:35 · 1511 阅读 · 0 评论 -
2016 UESTC Training for Dynamic Programming N - 柱爷与子序列 这题和N题有些相似之处、用了树状数组
这题和N题有些相似之处^_^ 题意:求所有相邻元素之差<=k的子序列数量 dp[i]表示以a[i]结尾的子序列数量 dp[i] = sum(dp[j]) 0<j<i, a[i]-k<=a[j]<=a[i]+k 数值很大,先离散化 用线段树或树状数组记录dp[j]的区间和, 这里选了树状数组 单点更新,区间查询 dp=get(r) - get(l-1); Update(x ,dp + 1); 要有+1 然后最后输出的时候 - n, 把多加了的1减掉 然后ans就是所以的dp值的和 注意点, 在树状数组里面原创 2016-05-17 12:21:50 · 1238 阅读 · 0 评论 -
2016 UESTC Training for Dynamic Programming Q - 柱爷的宝藏 斜率优化
dp[i] = min(dp[j] + (s[i]-s[j])^2+M), 0<=j<i 单调队列 dp[i] = min(dp[j] + s[j]^2 - 2*s[j]*s[i]) +s[i]^2+M min(dp[j] + s[j]^2 - 2*s[j]*s[i]) 令 q<p<i P[q].x = 2*sum[q] P[q].y = dp[q] + sum[q]*sum[q]; P[p].x = 2*sum[p] P[p].y = dp[p] + sum[p]*sum[p]; xy = q; que原创 2016-05-17 12:29:07 · 945 阅读 · 0 评论