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 · 1384 阅读 · 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 · 1239 阅读 · 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+Mmin(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 评论