目录
完成情况 | 题目 | 出处 |
---|---|---|
Trade | HDU 3401 | |
AC | Parade | HDU 2490 |
轻音乐同好会 | CDOJ 877 | |
诗人小G | BZOJ 1563 [NOI 2009] | |
AC? | MAX Average Problem | HDU 2993 |
AC | 玩具装箱 toy | BZOJ 1010 |
Post office | POJ 1160 | |
AC | 骨牌覆盖 V2 | 51NOD 1033 |
生成树计数 | BZOJ 1494 [NOI 2007] |
dp的优化
dp的优化分为这么几大类:
1.数据结构优化
2.决策单调性的优化
3.斜率优化
4.四边形不等式优化
5.矩阵快速幂优化
数据结构优化:
针对1D/1D型的dp,转移方程大概是dp[i]=min/max(dp[j]+g(i,j)),这样子我们可以用数据结构优化。常用的数据结构有线段树,树状数组,平衡树,单调队列等。
单调队列:
形如dp[i]=min(dp[j]+g[j]+f[i])这种式子,即我们可以写成两段完全不相干的式子,然后针对决策,用一个单调队列优化。
例题:
滑窗
找[l,r]的max。
单调队列的裸题,每次先入队,再查答案。
完全背包问题
这个可以做到nv的,具体做法如下:首先完全背包的转移式子是dp[i][j]=max(dp[i−1][j−v∗k]+w∗k)(0<=k<=n[i])
想办法把其分开,假设d=v[i],a=j/d,b=j,即j=a∗d+b,代入,并用k替换
dp[i][j]=maxdp[i−1][b+k∗d]−k∗w[i]+a∗w[i](a–n[i]<=k<=a),这样子按照余数分类就分开了。
HDU 3401
设dp[i][j]表示第i天有j个股票的最值,然后分别可以得到一些转移,至于优化,我们以买股票为例,dp[i−w−1][k]−APi[i]∗(j−k)=dp[i−w−1][k]+APi[i]∗k−APi[i]∗j(k<j),这个就分离了k,就可以单调队列搞了。
HDU 2490
Dp[i][j]表示在i行j列的答案,转移是
线段树,树状数组
雪菜为了能让冬马参加轻音乐同好会,瞒着春希,和冬马见面。为了增进感情,雪菜拉着还没缓过神来的冬马进了游戏厅……游戏要求两名玩家在排成一排的n个石头上跳跃前进,每个石头有一个高度,玩家只能向右跳,并且不能跳向比自己所在位置的石头矮的石头。一个石头在一个玩家跳离后就会消失,并且两个玩家不能同时站在同一个石头上。游戏分数为两个玩家站过的石头的总数。游戏起始,两名玩家都可以任选一个石头作为开始位置(当然不能相同)。由于冬马是挂科专家,雪菜又只有英语好,所以她们两人想请你帮助他们,怎么才能让分数最高。
dp[i][j]表示i到
将一个由N个非负数组a[i]成的序列划分成若干段,要求每段数字的和不超过M,求【每段的最大值】的和 的最小的划分方法,输出这个最小的和。
dp[i]表示i个的答案,转移是
决策单调性优化:
所谓决策单调性,就是dp在转移的时候,决策点是成段上升的,这样我们就可以用一种来维护,我们每算出一个dp值,就用它来更新他能管的区间,要怎么更新呢,注意到有单调性,所以可以二分来更新。
那么怎么判断是决策点单增呢,就要满足四边形不等式
∀i≤j,w[i,j]+w[i+1,j+1]<=w[i+1,j]+w[i,j+1]
例题
Bzoj 打字
设dp[i]为i的答案,设前缀数组为sc,转移是dp[i]=mindp[j]+(sc[i]−sc[j])2+m;0<=j<i
那么可以证明这个满足四边形不等式,所以就可以用了
虽然大多数决策单调性的题也可以用斜率优化,但是也有不能的,比如下面这道:
Noi 2009
dp方程很好写,是dp[i]=min(dp[j]+|s[i]−s[j]+i−j−1−l|p)
,不是平方,就用不了斜率优化(要是能用,那你怎么展开),但是还是有决策单调性,所以仍然可做。
。
斜率优化:
针对2D/2D的,形如dp[i]=min(a[i]×f[j]+b[i]×g[j])的转移,这种无法分开的转移,我们设f[j]=x,g[j]=y,dp[i]=a所以有a=min(a[i]x+b[i]y)相当于是固定斜率,求截距的最值,这个就是维护一个凸包。
例题:
还是之前那道打字题。
由dp方程可知dp[i]=sc[i]2+m+mindp[j]+sc[j]2−2sc[i]sc[j] ,那么设x=sc[j],y=dp[j]+sc[j]2,a=sc[i],即求y−2ax=dp[i] 这个直线,然后维护。
维护的步骤是:
1.去掉头部不符合的解。
2.算出dp值。
3.加入dp值。
去掉头部不符合的解的方法是判断斜率,当然也可以直接算。
加入dp值的方法就是维护图像的凸性,设之前的点为n1,再之前的为n2,那么我们要判断新加入的点n,要判断n1n,n2n,n1n2这几条的斜率,实际上可以只判断n2n与n1n的斜率。
通常的题,可以用斜率优化的话,代价是平方。而且大多数决策单调性的题也可以用斜率优化。
例题:
HDU 2993
这个就很裸的维护一个凸包。
Bzoj玩具装箱
设dp[i]表示i的答案,那么转移方程是:
四边形不等式:
如果转移是:f[i,j]=min(f[i,k]+f[k+1,j])+w[i,j],(比如区间dp)
如果对于i≤i′<j≤j′,有w(i′,j)≤w(i,j′),那么说明w具有区间包含的单调性。
如果对于
可以形象理解为两个交错区间的
这个四边形不等式有什么作用呢,我们可以证明,如果满足四边形不等式,那么设
例题:
用数轴描述一条高速公路,有V个村庄,每一个村庄坐落在数轴的某个点上,需要选择P个村庄在其中建立邮局,要求每个村庄到最近邮局的距离和最小。
我们设dp[i,j]表示i到
矩阵快速幂优化:
主要是优化线性的递推,而且没有
例题:
51nod 1033
明显的插头状压dp,那么转移就是线性的,但是情况有点多,我们可以打一个暴力算出所有情况,只有很少。
NOI 07年
那么如果要联通,只用i−5与前面的联通就可以了(不然没机会了),所以我们可以状压连通性,然后转移,但是情况一样很多,所以还是要用爆搜乱搞。最后搜出来只有52种。
另:矩阵乘法的优化:
就是可以证明M的好像没什么用)。
总结:
对于dp的优化,不同的转移有不同的优化:
1)如果转移可以写成完全分开的部分,可以用单调队列。
2)如果是1D/1D的,可以套一个数据结构。
3)如果有决策单调性(考试时可以打表证明),就二分。
4)如果是2D/2D而且系数较低(一般不超过二次),就可以斜率优化。
5)对于类似区间dp的,考虑四边形不等式。
6)线性递推式用矩阵乘法。