12.9省选训练总结

来源:互联网 发布:1962年中印战争知乎 编辑:程序博客网 时间:2024/06/05 19:23

目录

完成情况 题目 出处 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[i1][jvk]+wk)(0<=k<=n[i])
想办法把其分开,假设d=v[i]a=j/db=j,即j=ad+b,代入,并用k替换ak得:
dp[i][j]=maxdp[i1][b+kd]kw[i]+aw[i](an[i]<=k<=a),这样子按照余数分类就分开了。
HDU 3401
设dp[i][j]表示第i天有j个股票的最值,然后分别可以得到一些转移,至于优化,我们以买股票为例,dp[iw1][k]APi[i](jk)=dp[iw1][k]+APi[i]kAPi[i]jk<j,这个就分离了k,就可以单调队列搞了。
HDU 2490
Dp[i][j]表示在i行j列的答案,转移是dp[i][j]=max(dp[i1][k]+dis[k>j])我们对k大于jk小于j分别讨论,这样子比如大于的话,那么把dis写成前缀和的形式,有dis[k>j]=sum[j]sum[k],这样我们只需要dp[i1][k]sum[k]最大的就行了,这个可以单队。至于k>j,反过来再搞一遍就可以了。

线段树,树状数组

雪菜为了能让冬马参加轻音乐同好会,瞒着春希,和冬马见面。为了增进感情,雪菜拉着还没缓过神来的冬马进了游戏厅……游戏要求两名玩家在排成一排的n个石头上跳跃前进,每个石头有一个高度,玩家只能向右跳,并且不能跳向比自己所在位置的石头矮的石头。一个石头在一个玩家跳离后就会消失,并且两个玩家不能同时站在同一个石头上。游戏分数为两个玩家站过的石头的总数。游戏起始,两名玩家都可以任选一个石头作为开始位置(当然不能相同)。由于冬马是挂科专家,雪菜又只有英语好,所以她们两人想请你帮助他们,怎么才能让分数最高。
dp[i][j]表示ij的最值,转移的话是dp[i][j]=max(dp[u][j])+1(a[i]>=a[u])dp[i][j]=max(dp[i][v])+1(a[j]>=a[v]),然后这样我们可以发现他实际上是查前缀最值,就可以一个树状数组搞定。
将一个由N个非负数组a[i]成的序列划分成若干段,要求每段数字的和不超过M,求【每段的最大值】的和 的最小的划分方法,输出这个最小的和。
dp[i]表示i个的答案,转移是dp[i]=dp[k]+max(val[i j]),这样子是n2的,考虑优化。我们注意到这个还是有一定的单调性的,所以可以拿一个单调队列,但是因为max在一直变,所以队头的不一定是最优的,所以我们应该挂一个线段树,查区间最小值。(貌似有点难写)

决策单调性优化:

所谓决策单调性,就是dp在转移的时候,决策点是成段上升的,这样我们就可以用一种来维护,我们每算出一个dp值,就用它来更新他能管的区间,要怎么更新呢,注意到有单调性,所以可以二分来更新。
那么怎么判断是决策点单增呢,就要满足四边形不等式
ij,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]+ij1l|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]22sc[i]sc[j] ,那么设x=sc[j],y=dp[j]+sc[j]2,a=sc[i],即求y2ax=dp[i] 这个直线,然后维护。
维护的步骤是:
1.去掉头部不符合的解。
2.算出dp值。
3.加入dp值。
去掉头部不符合的解的方法是判断斜率,当然也可以直接算。

加入dp值的方法就是维护图像的凸性,设之前的点为n1,再之前的为n2,那么我们要判断新加入的点n,要判断n1n,n2n,n1n2这几条的斜率,实际上可以只判断n2nn1n的斜率。
通常的题,可以用斜率优化的话,代价是平方。而且大多数决策单调性的题也可以用斜率优化。

例题:

HDU 2993
这个就很裸的维护一个凸包。
Bzoj玩具装箱
dp[i]表示i的答案,那么转移方程是:dp(x)=min(dp(i)+w[i+1,x]),w[i,j]=(ji+sum(c)L)2,那么明显有决策单调性。自然,这道题是平方,所以可以用之前的方法,把它用斜率优化。

四边形不等式:

如果转移是:f[i,j]=min(f[i,k]+f[k+1,j])+w[i,j],(比如区间dp)
如果对于ii<jj,有w(i,j)w(i,j),那么说明w具有区间包含的单调性。
如果对于ii<jj,有w(i,j)+w(i,j)w(i,j)+w(i,j),我们称函数w满足四边形不等式。
可以形象理解为两个交错区间的w的和不超过小区间与大区间的w的和。
这个四边形不等式有什么作用呢,我们可以证明,如果满足四边形不等式,那么设s[i,j]dp[i,j]的决策点,那么有s(i,j1)s(i,j)s(i+1,j),所以就可以通过这个性质,把本来的转移平摊下来变成n的,相当于是把很多段拼成了一个n

例题:

用数轴描述一条高速公路,有V个村庄,每一个村庄坐落在数轴的某个点上,需要选择P个村庄在其中建立邮局,要求每个村庄到最近邮局的距离和最小。
我们设dp[i,j]表示ij全搞好的代价,转移就是dp[i][j]=mindp[i1][k]+w[k+1][j](k<j),那么这个w满足四边形不等式,可以优化。

矩阵快速幂优化:

主要是优化线性的递推,而且没有min之类没有可加性的转移。那么就更算递推数列的某一项一样,矩阵乘法就可以了。

例题:

51nod 1033
明显的插头状压dp,那么转移就是线性的,但是情况有点多,我们可以打一个暴力算出所有情况,只有很少。
NOI 07年
那么如果要联通,只用i5与前面的联通就可以了(不然没机会了),所以我们可以状压连通性,然后转移,但是情况一样很多,所以还是要用爆搜乱搞。最后搜出来只有52种。

另:矩阵乘法的优化:

就是可以证明Mi次方也是M1次方到Mi1次方的线性组合,所以转移系数,用向量来乘,优化成n2的(好像没什么用)。

总结:

对于dp的优化,不同的转移有不同的优化:

1)如果转移可以写成完全分开的部分,可以用单调队列。
2)如果是1D/1D的,可以套一个数据结构。
3)如果有决策单调性(考试时可以打表证明),就二分。
4)如果是2D/2D而且系数较低(一般不超过二次),就可以斜率优化。
5)对于类似区间dp的,考虑四边形不等式。
6)线性递推式用矩阵乘法。

原创粉丝点击