1D1D动态规划优化初步Word格式.docx

上传人:b****6 文档编号:17474831 上传时间:2022-12-01 格式:DOCX 页数:15 大小:42.60KB
下载 相关 举报
1D1D动态规划优化初步Word格式.docx_第1页
第1页 / 共15页
1D1D动态规划优化初步Word格式.docx_第2页
第2页 / 共15页
1D1D动态规划优化初步Word格式.docx_第3页
第3页 / 共15页
1D1D动态规划优化初步Word格式.docx_第4页
第4页 / 共15页
1D1D动态规划优化初步Word格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

1D1D动态规划优化初步Word格式.docx

《1D1D动态规划优化初步Word格式.docx》由会员分享,可在线阅读,更多相关《1D1D动态规划优化初步Word格式.docx(15页珍藏版)》请在冰豆网上搜索。

1D1D动态规划优化初步Word格式.docx

现在,显然f

(2)的值已经确定了:

它的最有决策只能是1。

我们用决策2来更新这个决策

表。

由于决策单调性,我们知道新的决策表只能有这样的形式:

111111*********1111111111111222222222222222222222222222222

这意味着我们可以使用二分法来查找“转折点”,因为如果在一个点x上,如果决策2更

好,则所有比x大的状态都是决策2更好;

如果x上决策1更好,则所有比x小的状态都是决策1更好。

现在决策1和决策2都已经更新完毕,则f(3)业已确定,现在用决策3来更新所有状态。

根据决策单调性,现在的决策表只能有以下2种类型:

111111*********111111111111111122222222222222222233333333333111111*********1111111113133333333333333333333333333333333333

而这样的决策表示绝对不会出现的:

111111*********333333333333333322222222222222222222222222222,不可能。

那么,我们的更新算法就是:

1、考察决策2的区间[b,e]的b点上是否决策3更优,如果是,则全部抛弃决策2,将此区间划归决策3;

如果否,则在决策2的区间[b,e]中二分查找转折点。

2、如果第1问的回答是“是”,则用同样的方法考察决策1。

推演到这一步,相信决策单调性的实现算法已经明了了:

使用一个栈来维护数据,占中的

每一个元素保存一个决策的起始位置与终了位置,显然这些位置相互连接且依次递增。

当插

入一个新的决策时,从后到前扫描栈,对于每一个老决策来说,做这样两件事:

1、如果在老决策的起点处还是新决策更好,则退栈,全额抛弃老决策,将其区间合并至新决策中,继续扫描下一个决策。

2、如果在老决策的起点处是老决策好,则转折点必然在这个老决策的区间中;

二分查找之,然后新决策进栈,结束。

由于一个决策出栈之后再也不会进入,所以均摊时间为0

(1),但是由于二分查找的存在,

所以整个算法的时间复杂度为0(nlogn)。

下面我们来看两个例题。

例题1:

玩具装箱。

题目来源:

湖南省选2008。

题目大意:

有n个玩具需要装箱,每个玩具的长度为c[i],规定在装箱的时候,必须严格按

照给出的顺序进行,并且同一个箱子中任意两个玩具之间必须且只能间隔一个单位长度,换

句话说,如果要在一个箱子中装编号为i~j的玩具,则箱子的长度必须且只能是

j

丨=j-i•c[k],规定每一个长度为I的箱子的费用是P=(1-L)2,其中L是给定的k=t

一个常数。

现在要求你使用最少的代价将所有玩具装箱,箱子的个数无关紧要。

分析:

本题可以很轻松地列出一个1D1D的动态规划方程:

X』j

f(x)二min{i()wi[,其中}w[i,j]=(jvc[k]-L)2。

ik甘

不难验证这个方程式满足决策单调性的,于是我们可以直接套用上文中的方法进行优化,时间复杂度为O(nlogn)。

例题2:

土地购买

USACOMonthly,March,2008,Gold

有N块土地需要购买,每块土地都是长方形的,有特定的长与宽。

你可以一次

性购买一组土地,价格是这组土地中长的最大值乘以宽的最大值。

比方说一块5*3的土地和

一块2*9的土地在一起购买的价格就是9*3。

显然,怎样分组购买土地是一门学问,你的任

务就是设计一种方案用最少的钱买下所有的土地。

将所有土地按照长度降序排列,依次检索,则当前土地的长度必然在上一块土地之内,

我们只需要考虑宽度就可以了。

而在宽度的问题上,当前土地的行为只能是这样:

和前面若

干块土地绑定;

同时这些绑定的土地和他们前后的土地分离。

这样很容易得出状态转移方程:

n」n

f(n)=吧可{(maxw[i])*l[k+1]+f(k)}

这个方程还不能满足决策单调性,下面我们试图再做一下简化。

如果将每一个土地的尺寸看成是一个二维坐标的话,(如下图)

其中不难看出,红色点完全可以忽略,这些点(x,y)必然满足一个性质:

存在点(x'

y'

同时满足x'

>

=且y'

=y这样它就能被一个组完全覆盖。

这些被忽略的点可以通过一次线

形的扫描得出。

n二

f(n)=叫》{%[n]*y[k1]f(k)}

这个转移方程就是标准的决策单调性了,读者可以通过w函数的性质直接证明它。

然后,

就用上文中的方法在0(nlogn)时间内求解。

以上两个例子都是决策单调性的直接应用。

其中第二个例子稍微复杂一些,如果不忽略那

些“肯定无用”的决策,不对数据进行有序化,则方程是不满足决策单调性的。

这也就提醒我们在做这一类题目的时候不能钻牛角尖死做,还得灵活一点。

另外,决策单调性提供的只是0(nlogn)的算法,事实上上面两个例题的最佳算法都是0(n)

的,在后文中我们将详细介绍另外一种经典模型,并且试图将这两个规划方程通过数学变换

转向另一个模型。

F面我们来看一类特殊的w函数:

~<

j:

:

k,w[i,j]w[j,k^w[i,k],显然,这一类函

数都是满足决策单调性的。

但是不同的是,由于这一类函数的特殊性,他们可以用一种更加

简洁也更加有借鉴意义的方法解决。

由于w函数满足-i冬j:

k,w[i,j]•w[j,k]=w[i,k],我们总是可以找到一个特定的一

元函数w'

[x],使得-i岂j,w[i,j]=w'

[j]一w'

[x],这样,假设状态f(x)的某一个决策是k,

有:

,其中g(k)二f(k)—w[1,k]。

f(x)二f(k)w[k,x]=f(k)w'

[x]「w'

[k]

二g(k)w'

[x]-w'

[1],

这样我们发现:

一旦f(k)被确定,相应地g(k)也被确定,更加关键的是,无论k值如何,

w'

[x]-w'

[1]总是一个常数。

换句话说,我们可以把方程写成下述形式:

x-1x

f(x^min{g(k)}w[1,x]。

不难发现这个方程是无聊的,因为min{g(k)}我们可以用一

个变量“打擂台”直接存储;

但是,如果在k的下界上加上一个限制,那这个方程就不是很无聊了。

于是,我们就得到了另一个经典模型。

经典模型二:

xJ

f(x)二min{g(k)}w[x],其中,b[x]随x不降。

k生[x『

这个方程怎样求解呢?

我们注意到这样一个性质:

如果存在两个数j,k,使得j<

=k,而

且g(k)<

=g(j),则决策j是毫无用处的。

因为根据b[x]单调的特性,如果j可以作为合法决策,那么k一定可以作为合法决策,又因为k比j要优,(注意:

在这个经典模型中,“优”

是绝对的,是与当前正在计算的状态无关的),所以说,如果把待决策表中的决策按照k排

序的话,贝Ug(k)必然是不降的。

这样,就引导我们使用一个单调队列来维护决策表。

对于每一个状态f(x)来说,计算过程

分为以下几步:

1、队首元素出队,直到队首元素在给定的范围中。

2、此时,队首元素就是状态f(x)的最优决策,

3、计算g(x),并将其插入到单调队列的尾部,同时维持队列的单调性(不断地出队,直到队列单调为止)。

重复上述步骤直到所有的函数值均被计算出来。

不难看出这样的算法均摊时间复杂度是

0

(1)的。

下面我们来看几个例题。

例题3:

TheSoundofSilence

BalticOlympiadinInformatics2007

给出一个N项的数列,如果对于一个连续的长度为M的片段来说,片段内所有

数中最大值与最小值的差不超过一个给定的常数C,则我们称这样的片段是一个合法的片

段。

编程求出所有的合法片段的起始位置。

本题不难看出可以分解为两个子问题:

求所有片段的最大值以及求所有片段的最小值。

而这两个任务实际上是一样的,所以我们只需要求取所有的连续M个数的片段中的最小值。

这个任务有很多很多种对数级算法,其中用堆或者用静态最优二叉树都可以做到

O(nlogm),但是这题的0(n)算法还是不那么好想的。

事实上,如果用g[x]表示数列中第x个数的值,用f(x)表示以x作为结尾的有M个数的连续片段的话,显然有:

x

f(x^.ngi[,直接吻合经典模型二。

套用算法,就可以在0(n)的时间内解决问题。

(当然,本题还有一种别致的“窗口”算法,也漂亮地在0(n)的时间内解决了问题,详

细可以看官方的解题报告。

这里引入本题的主要目的是在于佐证上文中讨论到的经典模型

二)

例题4:

Islands

1012008

给出一个具有N个顶点的无向加权图,同时这个图中有且恰有N条边。

现在,

对于这个图中的每一个连通分量,求出其最长路径(权值和最大,一个节点在路径上最多只能出现一次)。

当然,这个问题更多的是一个图论题。

但是在最后关键问题的处理上还是可以看到经

典模型二的影子。

首先,用BFS找出所有连通分量。

然后,对于一个连通分量来说,由于点数与边数相同,因此必然构成基环+外向树的结构。

我们可以找出基环并确定所有外向树的结构。

一条最长路径有两种可能:

完整地位于某一棵外向树中;

或者位于两棵外向树中,其间通过基环的一

段连接。

第一种可能可以通过树形DP解决,问题就在于第二种可能怎样处理。

如果枚举两

棵外向树,那就是0(n2),就不可以接受了。

我们考虑破环为链,然后将链整体左移,制作一个副本。

比方说,如果原来的环是:

4'

2,以1为首破环,得:

1--2--3--4,然后制作副本,得2--3--4--1--2--3--4,制作副本

3"

的主要目的是使得对于每一个点的方程都有统一的形式,使得环上所有片段都可以对应链上

的一个片段。

这种情况下,用g[x]表示x点上外向树上的最长下降路的长度,f(x)表示以该

点为终点的总最长路径的长度,则有:

x4

f(x)=max{g[i]g[x]dis[i,x]},其中w函数即w[i,j]di[s,i显]j然满足i立-n十

Vi<

j<

kw,i]j+W,jkw通过变换之后就可以变成经典模型二。

这样,就在

总0(n)的时间内解决了本题。

如果还嫌以上两个问题不够典型,下面举一个典型到所有0Ier都耳熟能详的题目。

例题5:

有限背包问题。

经典问题。

有N件物品,每一件物品的价值为p[k],重量为w[k],最多只能选取m[k]次;

现在给出背包的最大承重量C,要求在满足重量要求的条件下使得背包中的物品价值总和最

大。

如果m[k]=1或者m[k]=+^,就都很好做。

但现在m[k]是一个有界值,就比较麻烦了。

我们还是按照背包问题的常见思路,一次枚举每一个物品。

设当前枚举的物品编号为k,用

f(x)表示:

为了到达价值x,背包的重量至少应该是多少;

则我们有:

m[k]

f(x)二min{f(x-i*p[k])i*w[k]},这个方程很麻烦,因为某一个状态的决策不是连续

的,而是间断性的。

怎样把决策区间变成一段连续区间呢?

很容易想到等价类的思想;

如果

按照模p[k]对所有的f(x)划分等价类,那么在同一个等价类中,决策区间就是连续的了,我们不妨把新函数设为h(x),则方程变为:

X」

h(x)min{h(i)w[k]*(x-i)},其中,w函数即w[i,j>

w'

[k]*(卜i显然满足

i=x_m[k]

—i—j:

k,w[i,j]w[j,k]二w[i,k],(注意w'

是一个与i和j无关的常量)经过适当的

变化后可以转化为经典模型二。

于是有限背包问题可以在O(NP)的时间内解决,其中P是背

包可能取到的最大价值。

(其实换成重量也一样),这也就是“背包十讲”中所说的那个单调队列法。

我们注意到,如果m[k]=1的话,那么每一个f(x)的决策量都是O

(1),这没什么问题;

但如果m[k]=+R,有意味着什么呢?

仔细观察可以发现,这实际上就拿掉了方程中的循环变

量的下界,对应的是f(x)=min{g(k)}w[1,x]这样的一个方程,这显然是很简单的,适

k二

用单变量打擂台就可以解决了(尽管我们通常并不这样做)。

所以说,借助经典模型二,我

们在一个更高的高度上统一了0-1、有限、无限三大背包问题。

下面我们再次来看一下例题2《土地购买》中的那个方程:

n.4

f(n)=min{f(k)x[n]*y[k1]},我们来仔细地观察这个方程:

f(k)是变量,y[k+1]是常量,但不论怎么说,这两个量在以后的计算中都不会变化。

而x[n]是一个比例系数,它与k

无关,只随着x的变化而变化。

如果我们建立平面直角坐标系,以f(k)作为横轴,y[k+1]作为纵轴,则每一个状态f(k)都可

以看作是该坐标系中的一个点。

在求解状态f(n)的过程中,我要求最小化:

minP-xky,其中x,y是我建立的直角坐标系中某一个点的坐标(表示一个决策),k

就是方程中的x[n],是只与n有关,而与决策无关的一个常量。

这个最小化问题是什么呢?

其实就是一个平面上的线性规划。

我们把式子改写成:

1P1

yx,就演变成了这样的一个问题:

在一个直线簇yxC中,选取一条直

kkk

线,使得这条直线过某个给出的数据点,同时C要最小。

既然问题变成了这么有意思的线性规划问题,就有必要进一步的研究,看看是不时有更好的

解法,这就导致了我们的另一个经典模型:

经典模型三:

f(x)=m]n{a[x]*f(i)b[x]*g(i)}。

注意:

这个模型写的比较抽象,其实它的涵盖范围是很广的。

首先,a[x],b[x]不一定要是

常量,只要他们与决策无关,都可以接受;

另外,f(i)和g(i)不管是常量还是变量都没有关系,只要他们是一个有最优的f(x)决定的二元组就可以了。

因此,为了方便描述,我们把这个模型写成下面这个形式:

n-1

f(n)=miin{a[n]*x(i)b[n]*y(i)},

i日

其中,x(i),y(i)都是可以在常数时间内通过f(i)唯一决定的二元组。

这个经典模型怎样转化求解呢?

前文说过,这样的模型的求解与平面上的线性规划有关,

我们以x(i)为横轴,y(i)为纵轴建立平面直角坐标系,这样一个状态f(i)所决定的二元组就可

以用坐标系中的一个点表示。

然后,我们的目标是:

aP

mirP二axb,y其中a=a[n],b=b[n],化成:

yx,假设b0(反之亦bb

然),则我们的任务是使得这条直线的纵截距最小。

可以想象有一组斜率相同的直线自负无穷向上平移,所碰到的第一个数据点就是最优决策。

这个时候,有一个重要的性质,那就是:

所有最优决策点都在平面点集的凸包上。

基于

这个事实,我们可以开发出很多令人满意的算法。

这时,根据直线斜率与数据点分布的特征,可以划分为两种情况:

(具体的单调性视最优化目标

情况一:

决策直线的斜率与二元组的横坐标同时满足单调性。

的性质而定)

这样的模型是比较好处理的,因为这个时候由于斜率变化是单调的,所以决策点必然在凸

壳上单调移动。

我们只需要维护一个单调队列和一个决策指针,每次决策时作这样几件事:

1、决策指针(也就是队首)后移,直至最佳决策点。

2、进行决策。

3、将进行决策之后的新状态的二元组加入队尾,同时作Graham-Scan式的更新操作维护凸壳。

(注意此时当前指针所在二元组有可能被抛弃)

算法的时间复杂度为0(n)

情况二:

没有任何限制。

这时问题的解决就比较困难了。

显然,决策点还是应该在凸壳上。

我们不妨考虑一个单调

减的凸壳,这个凸壳上点与点之间的连线必然满足这样的性质:

斜率单调减。

通过细致的观

察我们可以发现,对于一个给定的斜率k来说,对应的直线簇中具有最大纵截距的直线通过的决策点必然满足这样的性质:

该点两侧的边的斜率k1,k2满足k1_k_k2。

这样,我们就可以通过二分查找来确定最佳的决策点。

但是,在插入数据点的过程中,我们遇到的麻烦可能更大。

首先,肯定是二分查找确定横

坐标的插入点,然后对两侧分别进行Graham维护凸性。

但接下来的问题就严重了:

在维护

凸形的过程中我们肯定删掉了一些点,怎样重新得到一个完整的凸壳决策表呢?

使用move是一个折中的办法,但是这与理论的时间复杂度分析根本无益。

完美的解决方法是应用平衡二叉树。

我们以横坐标为关键字建立平衡二叉树,这样查找和

插入的过程都可以在O(logn)时间内完成。

当我们做Graham维护时,首先将新数据点Splay

到根节点,此时剩下的节点必然分居左子树和右子树。

然后,我们以左子树为例,后序遍历

依次查找节点,直至查找到一个满足凸形的节点。

将这个节点Splay到根节点的左孩子,然

后删掉这个节点的右孩子。

这样的算法的时间复杂度是O(nlogn),但是实现起来非常复杂。

例题6:

《玩具装箱》的线性算法。

例题1中《玩具装箱》的动态规划方程为:

X」x

f(x)=mirf{i(X-(-•ck-L2],下面,我们试图通过数学变换将其变成经

'

-kM

典模型三。

X

为了简化计算,设sum[x]-7c[x],则:

4

f(x)二min{f(i)(x「i-1「Lsum[x]-sum[i])2}

=m』n{i(SUmx|MxL1)sUm#]i))}

不妨设a[x]二sum[x]x-丨-1,b[i]二sum[i]i,显然这两个量都是常量,则:

X-12

f(x)二mp{f(i)(a[x]-b[i])}

二m『{f(i)a[x]b[i]-2a[x]b[i]}

x-4,

二mp{f(i)b2[i]「2a[x]b[i]}a2[x]

然后问题就明朗了,设平面直角坐标系中x(i^b[i],y(i^f(i)b2[i],则问题变成:

minP=2ax■y,其对应的线性规划的目标直线为y=-2axP。

回顾定义不难看出,a[x]随着x的增大而增大,x(i)也随着i的增大而增大。

因此,问题中直线斜率单调减,数据点横坐标单调增,符合经典模型三种的情形1。

使用单调队列维护

凸壳可以在O(n)的时间内解决本题。

例题七:

货币兑换。

NOI2007

有3种货币体系:

人民币,A券,B券,其中A券与B券的价格在每一天都是

不同的。

在某一天D,你可以做3件事情:

1、如果你的手头上有A券或B券,你可以将它们都按照当天的价格换成人民币。

2、如果你的手头上有人民币,你可以将它们按照一个特定的比例Rate并以照当天的价格换

成A券和B券(就是说你兑换的A券和B券的价值比是Rate)

3、什么也不做。

一开始你有一些人民币,请你通过最佳的操作方式在最后一天结束的时候手头上握有最多的人民币。

试题中的Hint已经告诉我们,如果我们想买进人民币,就必须全额买进;

如果我们想卖出人民币,就必须全额卖出。

由于不管是在哪一天,人民币总是越多越好;

我们用f(n)

表示到了第n天最多可能持有的人民币数量,用x(i)和y(i)表示在第i天,用最多的钱能够

换成的A券和B券。

(注意:

由于Rate确定,兑换金额确定,所以A券和B券的数量是唯一确定的),我们有:

nJ

f(n)=max{a[n]*x(i)b[n]*y(i)},其中a[n]和b[n]代表a券和b券在第n天的牌价。

这个方程式符合经典模型三中的情形二。

所以,我们应该使用一个平衡树来维护凸形。

间复杂度是0(nlogn)。

由于数据弱,所以这道题目用move也是可以搞定的。

这篇文章中,我们着重讨论了这样三类经典模型的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1