您的位置:首页 > 其它

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 的规模,且转移方程单一,不涉及最大/小问题,像个递推式。求出转移矩阵,矩阵快速幂即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: