dp优化 12 - 09
2017-12-10 21:00
211 查看
数据结构优化
单调队列优化
dp[i]=min(f[j])+g[i]其中 l[i]≤j≤r[i], l 与 r 单调不减 。
双端队列队列,队列内保存之后可能成为最优值的值,保证有单调性。
特点是转移范围有限制。
真·数据结构优化
当 l,r 没有单调性时,就可以用线段树之类的数据结构快速查询决策点。比单调队列更好像,但复杂度要多一个 log 。
hdu 3401 Trade
Description
知道之后 n 天的股票买卖价格( api ,bpi ),以及每天股票买卖数量上限( asi,bsi ),问他最多能赚多少钱。开始时有无限本金,要求任两次交易需要间隔 W 天以上,即第 i 天交易,第 i+w+1 天才能再交易。同时他任意时刻最多只能拥有 maxp 的股票。Solution
dp[i][j] 表示第 i 天, 有 j 股最大收益。显然转移有三种情况,买,卖,不做事
dp[i−1][j]
max(dp[i−w−1][k]−api×(j−k)) ,其中 j>k 。
max(dp[i−w−1][k]+bpi×(k−j)) ,其中 k>j 。
把式子化简后可以得到单调队列优化的基本形式。
hdu 2490 Parade
Description
F 城有 n+1 个横向路和 m+1 个竖向路组成,你的任务是从最南边的路走到最北边的路,使得走过的路上的高兴值最大(高兴值可能是负值)。同一段路不能经过两次,且不能从北往南走,另外每条横向的路所花的时间不能超过 K ,输出最大的高兴值。Solution
dp[i][j] 到 i 行 j 列的最大值。dp[i][j]=max(dp[i−1][k]+|sum[j]−sum[k]|) ,其中 |j−k|≤K 。
显然满足单调队列优化的条件。
白学现场
Description
雪菜为了能让冬马参加轻音乐同好会,瞒着春希,和冬马见面。为了增进感情,雪菜拉着还没缓过神来的冬马进了游戏厅……游戏要求两名玩家在排成一排的 n 个石头上跳跃前进,每个石头有一个高度,玩家只能向右跳,并且不能跳向比自己所在位置的石头矮的石头。一个石头在一个玩家跳离后就会消失,并且两个玩家不能同时站在同一个石头上。游戏分数为两个玩家站过的石头的总数。游戏起始,两名玩家都可以任选一个石头作为开始位置(当然不能相同)。由于冬马是挂科专家,雪菜又只有英语好,所以她们两人想请你帮助他们,怎么才能让分数最高。Solution
d[i][j] 表示一个人在 i 结尾,另一个人在 j 结尾的最大收益。暴力转移
max(dp[u][j])+1 ,其中 a[u]≤a[i] 。
max(dp[i][v])+1 , 其中 a[v]≤a[j] 。
没有单调性,挂个线段树。
最大值和
Description
将一个由 N 个非负数组 a[i] 成的序列划分成若干段,要求每段数字的和不超过 M ,求【每段的最大值】的和 的最小的划分方法,输出这个最小的和。Solution
dp[i]=min(dp[j]+max[j+1][i])对于一个最大值 a[x] ,上一个最大值是 a[y] ,当 j∈[y,x) 时,max[j+1][i] 是不会改变的。
所以维护一个递减的队列,存的是符合要求的某一段的最大值。但是需要注意,队首元素不一定是最优的,由于队列的递减性质,队列中的所有元素都有可能组成最优解。需要加上线段树。
斜率优化
真正的口胡利器。一般来说转移方程含平方。
打印
Description
F 要打印一篇文章,打印每个单词都有一个费用 ci ,将第 i 个单词到第 j 个单词打印到一行的代价是为 sum(ck)2+m(i≤k≤j)。问如何排版使得总代价最少。Solution
dp[i]=min(dp[j]+(sum[i]−sum[j])2+m)展开。
dp[i]=sum[i]2+m+min(dp[j]+sum[j]2−2×sum[i]×sum[j])
设
x=sum[j]
y=dp[j]+sum[j]2
a=sum[i]
b=dp[i]
那么
b=min(−2ax+y)
问题变成了求直线 y=2ax+b 的最小截距。
把 (x,y) 坐标系里面,那么决策点一定在下凸壳上。
但是我个人不喜欢截距这种斜率优化方法。
hdu 2993
Description
给一个长度为 n 正整数的序列,找出长度 ≥k 的平均值最大的连续子序列。Solution
已写,略去。bzoj 1010 玩具装箱
Description
有 n 个玩具需要装箱,每个玩具的长度为 c[i] ,规定在装箱的时候,必须严格按 照给出的顺序进行,并且同一个箱子中任意两个玩具之间必须且只能间隔一个单位长度,换 句话说,如果要在一个箱子中装编号为 i j 的玩具,则箱子的长度必须且只能是 ,规定每一个长度为 l 的箱子的费用是 ,其中 L 是给定的 一个常数。现在要求你使用最少的代价将所有玩具装箱,箱子的个数无关紧要。Solution
已写,略去。四边形不等式优化
我曾经听uestc某选手说这个学了没用这玩意儿可以拿来处理这类方程
f(i,j)=min(f(i,k−1)+f(k,j))+W(i,j)
考虑 W ,若对于任意 i≤i′≤j≤j′ ,有
W(i,j)+W(i′,j′)≤W(i,j′)+W(i′,j)
称 W 满足四边形不等式。
设 f(i,j) 最优时决策点为 s(i,j),那么
s(i,j)≤s(i,j+1)≤s(i+1,j+1)
于是
f(i,j)=minf(i,k−1),f(k,j)+W(i,j)
其中 (s(i,j−1)≤k≤s(i+1,j))
油锯
Description
用数轴描述一条高速公路,有 V 个村庄,每一个村庄坐落在数轴的某个点上,需要选择 P 个村庄在其中建立邮局,要求每个村庄到最近邮局的距离和最小。Solution
dp[i][j] 表示建好 i 个邮局时覆盖到第 j 个村庄的最优解dp[i][j]=min(dp[i−1][k]+w[k+1][j])
打表得 w 满足四边形不等式。
打表大fa♂好,退竞保平安。
矩阵快速幂优化
可以处理求斐波那契额数列的第 n 项之类的问题。这类问题的规模一般十分巨大,巨大到不像是 dp 的规模,且转移方程单一,不涉及最大/小问题,像个递推式。求出转移矩阵,矩阵快速幂即可。相关文章推荐
- 暑期dp46道(12)--HDOJ 2191 多重背包+二进制优化
- SRM12 T2夏令营(分治优化DP+主席树 (已更新NKlogN)/ 线段树优化DP)
- dp(不含优化) 12 - 08
- 优化DP的奇淫技巧
- Noip2015 Day1 T3 斗地主(Dfs+Dp优化)
- hdu 5291 dp+优化 ****
- hdu 5185 dp(完全背包)+优化
- hdu 5411 CRB and Puzzle (矩阵高速幂优化dp)
- HDU 3045 DP斜率优化 解题报告
- bzoj3675 [ APIO2014 ] -- 斜率优化DP
- [dp专题-四边形不等式优化]51nod 1022
- [POI 2014]Little Bird(单调队列优化DP)
- dp单调队列优化(新)
- hdu 3392 利用滚动数组优化的dp
- bzoj 1010: [HNOI2008] 玩具装箱 toy [斜率优化dp] [动态规划]
- DP的四边形优化
- [矩阵快速幂优化DP]BZOJ 4037——Str
- 【二维树状数组优化dp】[Scoi2014] bzoj3594方伯伯的玉米田
- hdu 3507 Print Article(斜率优化dp)
- hdu5318 The Goddess Of The Moon (矩阵高速幂优化dp)