问题中的变与不变》Word文档格式.docx

上传人:b****5 文档编号:21344897 上传时间:2023-01-29 格式:DOCX 页数:9 大小:24.31KB
下载 相关 举报
问题中的变与不变》Word文档格式.docx_第1页
第1页 / 共9页
问题中的变与不变》Word文档格式.docx_第2页
第2页 / 共9页
问题中的变与不变》Word文档格式.docx_第3页
第3页 / 共9页
问题中的变与不变》Word文档格式.docx_第4页
第4页 / 共9页
问题中的变与不变》Word文档格式.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

问题中的变与不变》Word文档格式.docx

《问题中的变与不变》Word文档格式.docx》由会员分享,可在线阅读,更多相关《问题中的变与不变》Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。

问题中的变与不变》Word文档格式.docx

如果单纯枚举方向的话,光是各种方案的可能性就有21000000种,这个一个无法承受的数字。

因此不可能去枚举每个蚂蚁的方向,不如先从简单的问题着手。

假设我们已知了蚂蚁初始的方向后,接下来的任务就是模拟所有的蚂蚁相遇和掉落的过程,求出最后一个掉落的时间。

在这个过程中,最复杂的变量就是每只蚂蚁的方向了,明显在最坏情况下相遇次数可能达到N2级别,仅仅是维护每只蚂蚁的方向和位置都是不能满足题目的时间复杂度的要求的。

我们从细节开始考虑问题:

首先考虑题目中最基本的一个操作也就是2只蚂蚁碰头的情况:

假设一只蚂蚁A从左向右爬行,在X点的时候遇到了另一只从右向左的蚂蚁B后返回。

同时蚂蚁B也从X向右返回。

图12只蚂蚁相撞后的情况将这2只蚂蚁有用的信息也就是速度iV(iV是向量)和当前位置iW记录下来一起构成集合U,也就是)},(),,{(bbaaWVWVU。

在蚂蚁A和蚂蚁B相遇前瞬间一刻,)},1(),,1{(XXU而在蚂蚁A和蚂蚁B相遇后瞬间一刻,)},1(),,1{(‘XXU我们发现U=U,也就是说虽然对于每只蚂蚁,它的速度发生了改变,但是把这2只蚂蚁放在一个集合看的话,这个集合并没有发生变化。

或者说,在同一个集合内的蚂蚁相遇,这个集合是不会变的。

于是把所有的蚂蚁看成一个大集合)},)...(,(),,{(2211nnWVWVWVV。

根据上面说提到的,在这个集合V内的任何相遇对于集合V都没有影响。

同时我们通过集合V可以知道,虽然每只蚂蚁掉落的时间Ti无法求出,但是所有的Ti所构成的集合T我们是可以求出来的。

事实上就是T={第I只蚂蚁按初始方向走到一端点的时间|1iN}。

得到了这个有效的结论后,我们回到原来的问题:

它们最早何时全部掉落,最迟何时全部掉落。

先考虑最早何时全部掉落:

根据T={第I只蚂蚁按初始方向走到一顶点的时间|1iN},我们贪心的让每只蚂蚁都朝离自己最近的端点爬行,即可保证T中最大值最小。

同理最迟何时全部掉落的情况就是每只蚂蚁朝离自己最远的端点爬行,即可保证T中最大值最大。

最终我们得到了一个时间复杂度为O(N)的算法了。

这已经是理论的下限了。

小结通过集合的概念,我们将原来要维护每个蚂蚁的方向,位置这些规模庞大的变量转化成一些常量。

而通过这些常量不用维护就可以直接得出最终结果。

集合操作在这类变量转化成常量的问题有极广泛地运用,常常可以利用题目给定的条件,来构造集合,然后利用集合内元素之间的特殊性质来判断无解或者优化算法。

通过这道题目我们也能看到,仔细观察,从细节入手,寻找变量之间的联系,才能找到将变量转化成常量的方法。

例2:

NavigationGame[2]这里有一个N行M列的方阵,第N行象征着这里,第1行象征着海那边的彼岸。

这中间的N-2行象征着你所期盼的大海。

你的目标是,控制一艘船,从这里的任意一个停泊处(用H表示),经过最短的航行时间到达对岸的任意一个停泊处。

只有这样,你才可以通过这个通道。

你的船只能向左,向右或向上前进,一次一格,而且除非登陆(这时你必须到达一个停泊处,从而结束你的游戏),你是不能驶向陆地的。

记住,人生没有回头路。

因此,一旦你离开一个格子,就永远也无法返回。

向着目标航行永远是一件令人愉快的事情。

因此向上航行只需要消耗一个单位的时间。

但是,看似原地打转的左右方向的航行会让人厌倦。

如果某次左右航行之前你已经连续进行了x次左右航行,你这次左右航行所消耗的时间就是x+1个时间单位。

海上你可能会遇到:

O:

障碍物。

障碍物占据的格子,你永远也不会到达。

F:

命运之轮。

经过这里,你的命运会从此逆转。

我了解你的命运有多么不幸。

因此,你必须在航行途中经过奇数次命运之轮,才能安全到达彼岸。

B:

祝福石。

走到这里是不需要时间的。

S:

暴风雨的咒符。

走到这里所需的时间是正常情况的两倍。

HHOBFFSOOOOOOOOO1F1OH图2例2的一个样例说明数据范围约定:

N,M1000。

根据题目的要求,不能走回头路,同时只能向上或者向右或者向左,于是我们考虑使用动态规划:

设jitf,,表示从起点到(I,J)且走过的命运之轮的次数为T的最少的代价(T表示奇偶性)。

设jiC,表示从(I+1,J)到(I,J)的代价。

于是得到状态转移方程:

}cos{,,,,1,‘t,,itfjkikikijtCfMin10121321123(其中jkit,,cos表示从(I,K)移动到(I,J)按照题目所给要求的代价,且(I,K)到(I,J)之间没有障碍物,T=Txor(I,K)到(I,J)之间F个数)假设如果没有题目所限制O,S的限制,那么2)1|(|||cos,,kjkjtjki。

首先我们只考虑从左往右走。

那么状态转移方程可以写成:

}21)k-k)(j-(j{,,1,‘t,,itfkikijCfMin不妨另jU=jitf,,,kV=kikitCf,,1,‘。

状态转移方程就变成了}2)1)(({jijiVMinUji考虑Ui的最优决策K,那么满足(ikl):

ilkllVkkVli2liVki2kilkl

(2)))1(2())1(2()1)(()1)((Vk另)1(2iiVXii,iYi2。

把iX,iY画在平面坐标轴上,根据上面的式子有(kX,kY)-(lX,lY)之间的斜率小于i的时候,决策k比决策L更优。

事实上这是一个经典的斜率优化动态规划的模型[3]。

根据一般性我们知道维护一个队列表示(iX,iY)的凸包中的下凸部分即可在均摊O(n)的时间内求出iU最优值。

具体操作如下:

用stack队列来表示这个凸包的下凸部分。

同时设队首指针st和队尾指针en。

根据Stack队列维护的是凸包的下凸部分,那么满足下面的性质2.1:

1.1stack2stackenstack2.1stack-2stack的斜率2stack-3stack的斜率.1enstack-enstack的斜率具体操作如下:

从小到大枚举I。

对于当前I,如果满足ststack-1ststack的斜率i,则不断删除队首元素。

此时队首元素就是当前I的最优决策。

同时把I加入队列队尾,维护队尾满足性质2.1。

同样我们也可以用类似的方法求出从右向左走的最小值。

但是这道题目有个很独特条件:

经过S不用时间和经过B时间加倍。

由于从不同的起点经过一个S或者B产生的代价的改变是不同的,这个变化值决定了上面所说的方法不能够直接搬到这个问题来。

回到原来的方程}cos{,,,,1,‘t,,itfjkikikijtCfMin上。

还是先考虑从左往右走,即jk。

显然,无论(I,J)-(I,K)之间无论是B或者S,变量jkit,,cos都能表述成一个关于(J-K)的二次函数。

不妨设bkjakjkjtjki)

(2))(1(cos,,。

当然a和b都是需要维护的变量。

先考虑如何维护jkit,,cos。

假设K已经固定,当前bkjakjkjtjki)

(2))(1(cos,,。

下面观察1,,cosjkit。

1.(I,J+1)上不是B也不是S:

有abkjakjkjKJJKIttJKI)1

(2)1)(2()1(),,(coscos1,,2.(I,J+1)上是B,不需要时间:

有abkjakjkjJKIttJKI)1)(1

(2)1)(2(),,(coscos1,,3.(I,J+1)上是S,时间要加倍:

有abkjakjkjKJJKIttJKI)1)(1

(2)1)(2()1

(2),,(coscos1,,根据上面所说,我们及时更新a,b就能得出新的1,,cosjkit。

同时我们也能看到a的意义就是在(I,K+1)-(I,J)这一段中,bsa。

我们看另一种情况:

如果J固定,而K发生变化的时候,jkit,,cos的维护。

重新扫描一遍肯定会导致算法效率低下。

而且jkit,,cos变量一共有O(n3)的级别,即使我们能在均摊O

(1)的时间内算出所有jkit,,cos时间复杂度依然是O(n3)的。

于是考虑优化算法,尽量在短时间内算出对我们有用的信息。

假设当前已知bkjakjkjtjki)

(2))(1(cos,,,而且已知)(‘b)(‘a2))(1(cos,,klklklkltlki的a和b。

下面我们要求jlit,,cos。

既然重新求jlit,,cos没有太好的方法,我们干脆做一个大胆的猜想那就是希望改变一些变量值使得jkit,,cos的a和b能直接满足jlit,,cos的要求。

把jkit,,cos的代价分为2个部分,一部分表示从(I,K)出发在(I,K)-(I,L)这一段的代价,另一部分表示在(I,L+1)-(I,J)这一段的代价。

而第1部分的代价显然就是lkit,,cos。

第二部分当中既有对我们有用的代价jlit,,cos,同时也有一部分tcos的多余代价(从L出发比K节省的时间)。

于是我们得到Cflilit’)

(2))(1(coscoscoscos,,1,‘t,,,,,,1,‘t,,li,,1,‘bbljaljljCftttCftlililkijkililij于是我们只要给’,,1,‘tbCflili就无需改变a和b。

而这样做会不会对’,,cosjlit产生影响?

我们分析由jlit,,cos-‘,,cosjlit的过程,就能知道这样做是没有任何影响的。

而这样做的好处就是能把jkit,,cos用一种更具体的形式给出。

而不是一个虚拟的变量。

实际上为了方便处理我们可以另bcfgjijitjit,,1,‘,,‘。

(b就是上文jlit,,cos中的b,也可以看成是jitf,,的最优决策k,jkit,,cos中的那个b)这样原状态转移方程就可以写成})

(2))(1({}cos{,,‘t,,,,‘t,,itbkjakjkjgMintgMinfkijkikij(虽然a,b是变化的,但是对于单独的一个jitf,,,a,b是固定的)。

仿照没有B和S时的思路,设最优决策K,同时观察决策L。

)1)((,,‘agkit2)

(2))1(2())1(2()

(2)1)(()(2,,‘t,,‘t,,‘tajlkllgkkgljaljljgkjkjkjlikili另)1(2,,‘tkkgXkik,kYk2。

还是仿照上面的思路维护一个队列表示),(iiYX所构成的凸包的下凸部分。

具体操作同没有B和S的情况类似,这里就不重复了。

但是这样是否依然能保证正确性?

每次J会增加1,而无论(I,J)上是B或者S,a只会发生1的变化。

于是右边的改变量J依然能保证是非负的。

所以正确性显然。

而从左到右反过来考虑即可。

总的时间复杂度:

O(行数*(列数+队列的操作数))=O(NM)。

小结这道题目中,由于特殊的条件的约束,如果使用其他方法维护cost(I,K,J)中的a,b反而令问题更加复杂。

于是大胆猜想,通过调整其他变量使a,b不变,从而在后面的问题中,利用队列和斜率将算法优化到O(NM)。

例三:

CircularRailway[4]在一条长度为L的环形轨道上有N个A类点,N个B类点。

现在要你安排一种方案使得这N个A类点和N个B类点一一匹配。

并且所有匹配点之间的最短距离(指在轨道上)和最小。

数据范围:

1n50000,2L109分析:

首先将N个A类点按顺时针排序后设他们的坐标为1A,2A..nA。

将N个B类点按顺时针排序后设他们的坐标为1B,2B..nB。

(同时另iniBB)显然问题实际上就是一个二分图的最小权匹配。

但是最小权匹配最坏情况下是O(n4)的时间复杂度,对于题目的数据范围,肯定是不能满足要求的。

仔细分析我们就能发现最小权匹配时有一条重要的性质:

性质3.1:

2条匹配边肯定不会相交。

图3性质3.1的证明反证:

如果出现了2条匹配边iA-vB和jA-uB相交,那么我们交换iA,jA的匹配使得iA-uB和jA-vB肯定可以让匹配的总权值最小。

(如图3所示)按照性质3.1,我们可以知道最小权匹配必然满足下面的条件:

不妨另1A匹配的点是jB,然后iA(1in)匹配的点就是从jB开始顺时针数到的第i个B类点。

(如图4所示,绿色代表iA,蓝色代表iB)图4最小权匹配的方案既然最小权匹配满足上述条件,我们得到了算法3.2:

枚举与1A匹配的点jB,然后根据上面的条件,可以知道iA匹配的点就是1jiB。

然后根据每条匹配求出总代价,这当中最小的代价就是我们要求的最小权匹配了。

算法3.2的时间复杂度为O(n2)。

尽管对于n=50000仍然有些力不从心,但是已经有了很大的进步了。

继续分析假设iA匹配的点iQB,同时设iC表示iA至iQB的最短距离。

那么我们知道在上面所说的算法中,只要维护了变量iC,就能得出最优答案。

但是仅仅是把所有的有n2种不同的值。

这也意味着维护或者预处理计算Ci的时间复杂度都是O(n2)的。

为了优化算法,我们要考虑另辟捷径。

iA至iQB的最短距离求出来就已经O(n2),也就是说Ci一共换个角度考虑Ci。

下面具体分析Ci。

同时令j=iQ。

下面考虑jiiBAC的几种取值可能。

1.jijiiBABAC2.ijjiiABBAC3.jijiiBALBAC4.ijjiiABLBAC下面继续分析最优值分别为每种情况的时候iA和jB关系。

1.当jiiBAC最优,此时iA和jB要满足条件:

1.iAjB2.iA-jBL/22.当ijiABC最优,此时iA和jB要满足条件:

1.jBiA2.jB-iAL/23.当jiiBALC最优,此时iA和jB要满足条件:

1.jB-iAL/24.当ijiABLC最优,此时iA和jB要满足条件:

1.iA-jBL/2通过上面的分析发现Ci只与当前的iA和jB有关,既然关于变量Ci无能为力,那么我们不妨把注意力放到iA和jB上来,不妨另)()(jiiBgAfC。

下面考虑iA对Ci的影响,也就是函数)(iAf。

根据上面的分析,我们知道当1.当jB-iAL/2有,iiAAf)(①2.当L/2jB-iA0有,iiAAf)(②3.当L/2iA-jB0有,iiAAf)(③4.当L/2iA-jB有,iiALAf)(④我们把注意力放到变量)(iAf上来,通过上面的讨论,可以知道)(iAf虽然还是个变量,但是与Ci相比,当j从1递增到N这个过程中)(iAf最多有4种情况,事实上1,4不会同时出现,只有3种。

也就是说)(iAf可以看成是几乎不变的常量了。

同样的方法分析)(jBg最多也只有4种变化。

现在我们从小到大枚举和A1匹配的点Bk后,其他的点按顺序一一匹配,现在的总代价)()())()((iijiiBgAfBgAfCSum。

当k变化的时候,我们只看)()(iiBgAfSum的变化,把Ci放到一边。

根据上面的分析,在我们从1到n枚举K的过程中,每一个)(iAf,)(iBg最多只会变4次。

而我们可以通过预处理知道对于每个)(iAf,①变到②是在K=1X变成K=1X+1时改变的,②变到③是在K=2X变成K=2X+1时改变的,③变到④是在K=3X变成K=3X+1时改变的。

同理也可以通过预处理知道每个变量)(iBg它发生改变的时间。

不妨把)(iAf,)(iBg发生改变看成一次事件,可以知道事件总数肯定不会超过8n。

假设我们已经通过预处理知道每件事件发生的时间(每次事件的时间x指事件是在k=x变成k=x+1发生的)。

而通过这些事件我们就可以即时维护Sum。

在Sum达到最小值时,就是我们要求的答案了。

整个算法的流程如下:

1.将Ai和Bi排序。

2.预处理求出每个事件发生的时间。

3.从1到N枚举K,同时通过hash表找出哪些事件发生在这个时刻,同时维护Sum。

4.输出Sum的最小值。

下面我们考虑预处理。

预处理求1X,2X,3X实际上就是要我们求对于每个Ai情况①②③④所对应的J的范围。

而根据iA和iB的有序性,我们用指针就能维护情况①②③④所对应的J的范围。

时间复杂度分析:

O(排序复杂度+预处理+事件总数)=O(nlgn+n+8n)=O(nlgn)回顾整个过程,我们发现只要牢牢把握住问题的实质,抓住最重要的变量总代价,进而把每项Ci分开看成2个不相干的部分,对2个常量)(iAf,)(iBg分别进行讨论求值,最终将算法优化到了一个满意的时间复杂度。

本文简要的举出了3道例题,介绍了在信息学中,将变量化成不变的技巧。

实际上,这种技巧在很多地方中都有建树。

本文限于篇幅,介绍了三种比较典型的方法。

从这些题目中也能看到,这种技巧的运用远不是简单的化简,有些变量之间的关系存在的很隐蔽,这就需要我们通过仔细观察,大胆猜想,深入分析才能找到合适的常量。

[1]zjuonlinejudge2376ants./show_problem.php?

pid=2376[2]pkuonlinejudge2841navigationgame./JudgeOnline/problem?

id=2841[3]汤泽.浅析队列在一类单调性问题中的应用.2006集训队论文.[4]sguonlinejudge313circularrailway.http:

//acm.sgu.ru/problem.php?

contest=0problem=313[5]刘汝佳,黄亮.算法艺术与信息学竞赛.清华大学出版社.2003

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

当前位置:首页 > 表格模板 > 合同协议

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

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