网站大量收购独家精品文档,联系QQ:2885784924

I关于的斜率优化.docVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
I关于的斜率优化

关于dp的斜率优化 废话在后面讲 以下引用自2006冬令营汤泽论文: 斜率优化,亦就是说把决策与决策之间表示成一个类似斜率?的式子,进一步分析其中的单调性,并用队列维护其有用决策。因此斜率优化又称为队列优化。 ? 我们来看下论文中讲的??????锯木场选址 (CEOI2004) [题目描述] 从山顶上到山底下沿着一条直线种植了n棵老树。当地的政府决定把他们砍下来。为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂。木材只能按照一个方向运输:朝山下运。山脚下有一个锯木厂。另外两个锯木厂将新修建在山路上。你必须决定在哪里修建两个锯木厂,使得传输的费用总和最小。假定运输每公斤木材每米需要一分钱。 任务 你的任务是写一个程序: 从标准输入读入树的个数和他们的重量与位置 计算最小运输费用 将计算结果输出到标准输出 输入 输入的第一行为一个正整数n——树的个数(2≤n≤20 000)。树从山顶到山脚按照1,2……n标号。 接下来n行,每行有两个正整数(用空格分开)。 第i+1行含有:wi——第i棵树的重量(公斤为单位)和?di——第i棵树和第i+1棵树之间的距离,1≤wi?≤10 000,0≤di≤10 000。最后一个数dn,表示第n棵树到山脚的锯木厂的距离。 保证所有树运到山脚的锯木厂所需要的费用小于2000 000 000分。 输出 输出只有一行一个数:最小的运输费用。 样例输入 9 1 2 2 1 3 3 1 1 3 2 1 6 2 1 1 2 1 1 样例输出 26 [算法分析] 初步分析:我们明确题目的核心:最优值问题。再加上树木只能往下传送,满足无后效性。那么此题用动态规划解决是十分明显。 进一步分析:题目中说明第n棵树下面还有一个锯木厂,不妨把它当作第n+1个位置来考虑。为了分析的方便,我们增设几组变量: Sw[i]表示1~i棵树的总重量,表达式为?,时间复杂度为O(n)。 ? Sd[i]表示1~i棵树的距离,表达式为,时间复杂度为O(n)。 Cost[i]表示把第一锯木场设在第i棵树的位置上,1~i棵树到i所需的费用。表达式为,时间复杂度为O(n)。 All[i,j]表示把第i~j棵木头都运送到第j棵树的位置上所需要的费用。表达式为?,对于求每一项所需的时间复杂度为O(1)。   接下来,设状态列方程。 设F[i]表示第二个锯木厂设在i处所需的总费用。 那么状态转移方程为:? 该方程的时间复杂度为O(n2)?,这远远不能满足题目的要求n=20000。因此我们必须对其进行优化。 ???? 优化:提出这样一个设想:假设当前第二锯木厂设置在i,而它的最优决策为k,也就是说求出的F[i] 值是当j取k时得到的,而对于F[i+1]的最优决策k1必然大于等于k。下面我们对其进行证明。 由此可知slope[1~k-1,k]=sd[i](因为k为F[i]的最优决策),而对于F[i+1]有sd[i+1]=sd[i],即知slope[1~k-1,k]=sd[i+1],所以F[i+1]的最优决策k1=k; 继续看论文: 由此我们可以得知,决策j是满足单调性的。 如何来维护这种单调性呢? 不难发现Slope[j1,j2](j1j2)这个变量,实际上就是一个斜率的式子,其中?为Y坐标,Sw[j]为X坐标。当它能满足的不等式①,亦就是说明j1优于j2,反之则是j2优于j1。又由于Sd[i]是递增的,所以当前最优的决策j1始终会被次优的决策j2所替代,至此决策j1就再无用武之地可以完全忽略从决策集合中删除。另一方面,当前求出F[i]之后,i也能够成为之后的决策,所以应该将其并入集合中。 维护决策的过程中既要维护决策的有序性,而且还要支持在前端的删除和后端的添加。理所当然我们选择用队列来维护。 队列中需要满足的以下两个性质: 队列所需要满足的就是一个上凸的性质。 根据以上的两个性质,我们对队列的维护进行如下的2个操作: 设该队列为List,其中h为队头坐标,t为队尾坐标。 1、在计算F[i]之前,从队头开始扫描,若当前slope[List[h],List[h+1]]=sd[i]?,也就是说List[h+1]比List[h]更优则删除List[h]元素。 2、在计算F[i]之后,将i添加到队尾,并维护好队列的性质2。    我们所面临的情况无非是两种:    (1)slope[list[t-1],list[t]]slope[list[t],i]这显然满足性质2,于是把i加入队列;如下图: ???????? (2)slope[list[t-1],list[t]]=slope[list[t],i],如下图: ???????此时,如果有sd[i]=slope[list[t-1],list[t]]=slope[list[t],i],即list[

文档评论(0)

xiayutian80 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档