- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态规划优化
2.2.1.1分析 简单的想法是首先枚举横向如何对土地进行分割,然后再对纵向进行动态规划。 枚举部分我们不多说,这里共需要C(N,r)的时间,我们用数组lis记录分割情况 关于动态规划,不难得到如下方程: opt[i][k]表示第i个竖线为第k个分割线。 转移比较简单 opt[i][k]=min{max(opt[j][k-1],f(j,i))} 2.2.1.1分析 代价f我们可以边转移边计算。 我们从i开始从后往前枚举j,那么我们显然每次只需要O(N)的代价就可以计算出当前的f。 动态规划的时间复杂度为O(rsM2) 算法的总体复杂度为O(C(N,r)rsM2) 2.2.1.2优化 1.预处理出sum[x][y]数组,记录矩形(1,1)-(x,y)中每个格子的工作量之和。 则对于任意矩形,我们都可以在O(1)时间内计算出部分和。 2.搜索完行的拆分之后,我们预处理出所有f数组。 计算f数组的时间复杂度为O(M2r) 此时动态规划复杂度为O(M2s) 总复杂度降为O(C(N,r)M2(r+s)) 2.3 费用提前计算 在动态规划问题中很多时候计算转移代价成了我们一个很棘手的问题,有些时候我们可能要花费很多的力气来计算某一些特定状态下的费用(比如边界状态等等) 其实很多时候我们可以用一些方法,把费用计算花去的时间平摊到其他的地方,从而优化动态规划 2.3.1例题 Sue的小球(sdtsc 2008) 天空中有N个坐标为(xi,yi)的小球,并会以vi速度匀速下降,这个小球的价值就是其y坐标的1000分之一 你有一个在x坐标轴上滑行的飞行器,可以以单位速度在x轴上平移,只要和小球到同一x坐标就能收获那个小球。 假设你一开始在(0,0),并且希望收获所有小球,问可能的最大收益是? N1000 2.3.1.1分析 由于所有小球的x坐标是不变的,因此我们按照x坐标将小球排序。 观察一个性质: 我们获得球必然是一个连续区间。 因此不难得出动态规划表示方法: opt[L][R][0/1]表示获得球的区间是[L,R],同时此时飞行器在左边/右边球所对应的x坐标。 2.3.1.1分析 但是,如何计算代价呢? 考虑到一个很好的性质:飞行器的移动速度是单位速度。 一种简单的方式是增加一维时间: opt[L][R][T][0/1]表示时刻T此时的状态。 可以使用队列保存可行状态,再使用更新状态的方法进行转移。 2.3.1.2优化 现在问题的关键在于如何快速的计算费用。 我们现在纠结的问题在于,我们并不知道之前我们是如何行走的,所以如果没有T,我们并不知道当前我们面对的球到底是多少价值。 2.3.1.2优化 我们不妨换个思路,为什么要去纠结于之前的状态呢? 当我们做了一个决策之后,对后面的影响我们是知道的,为什么不能把握这一我们清楚的信息呢? 道理很清楚: 2.3.1.2优化 每次决策后,我们将这一次移动对所有我们还没有得到的小球产生的费用损失都在决策时计算。 我们可以看作小球都没有动,只是在我们每次决策是损失了一些价值。 假设当前移动花费了时间T,我们还没有得到的小球的速度和是SV,那么损失的代价就是T*SV/1000 2.3.1.3问题的解决 我们用S[I]记录前I个小球的速度和 那么我们的转移方程就是: opt[L][R][0/1] -(S[N]-S[R’]+S[L’-1])*T/1000 +value opt[L’][R’][0/1] 时空复杂度 O(N2) 2.4参数分离 这是一个信息学竞赛中非常重要的手段,当然难度也比较大,这里限于篇幅和难度,只是简单说一下。 参数分离就是通过数学变形将和决策有关的变量和状态有关的变量分开,从而发现一些性质来优化动态规划。 2.4.1例题 Triangles (POI07-08 StageIII) 给定平面上N1000个点,则显然会构成N(N-1)(N-2)/3个三角形 求所有这些三角形的面积和 2.4.1.1预备知识 首先必须要知道叉积…… 向量a=(x1,y1),b=(x2,y2) 则有: a × b = x1 * y2 – x2 * y1 =|a||b|sinΘ Θ为有向角度 因此只要保证方向为正,那么向量a和b组成的三角形面积即为(a × b)/2 2.4.1.2分析 首先我们花O(N)的时间枚举左下角c 所有需要计算的点都以点c为原点建系 假设坐标为x[i]和y[i] 按极角排序后,我们要求的就是 不难得出一个O(N3)的算法 2.4.1.3优化 我们给式子做一个变形 我们用Sy[i]记录y[i]到y[N]的和,Sx[i]记录x[i]到x[N]的和,那么要求的就是 注意此时i和j这两个参数相互分离! 2.5 单调性 这是很难的一部分内容,个人认为,如果是把目标放在NOIP级别
文档评论(0)