动态规划之队列优化.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态规划之队列优化

动态规划之队列优化 浙江省镇海中学 贺洪鸣 【例1锯木场选址】(CEOI2004) 从山顶上到山底下沿着种植了n棵树。当地的政府决定把他们砍下来。为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂。木材只能按照一个方向运输:朝山下运。山脚下有一个锯木厂。另外两个锯木厂将新修建在山路上。你必须决定在哪里修建两个锯木厂,使得传输的费用最小。运输每公斤每米需要一分钱。任务你的任务是写一个程序: 从标准输入读入树的个数和他们的重量位置 计算最小运输费用 将计算结果输出到标准输出 输入输入的第一行为一个正整数n——树的个数(2≤n≤20 000)。树从山顶到山脚按照1,2……n标号。接下来n行,每行有两个正整数(用空格分开)。第i+1行含有:i——第i棵树的重量(公斤为单位)和 di——第i棵树和第i+1棵树之间的距离,1≤i ≤10 000,0≤di≤10 000。最后一个数d,表示第n棵树到山脚的锯木厂的距离。保证所有树运到山脚的锯木厂所需要的费用小于2000 000 000分。 输出输出只有一行一个数:最小的运输费用。9 1 2 2 1 3 3 1 1 3 2 1 6 2 1 1 2 1 1 在解决这一问题时,首先我们要明确,将锯木厂建立在相邻两棵树之间是没有任何意义的,否则我们可以将这样的锯木厂上移到最近的一棵树处,此时运送上方树木的费用减少,运送下方树木的费用没有变化,总费用降低。 为了方便讨论,我们先作如下定义: 假设山脚锯木场处也有一棵树,编号为,并且v[n+1]=d[n+1]=0。 表示第1棵树到第棵树的质量和,即。 表示第1棵树到第棵树的距离,即。特别的,有,表示第1棵树到自己的距离为0。 c[i]表示在第棵树处建一个锯木厂棵树处建一个锯木场,并且将第j到第i棵树全部运往这个锯木场所需的费用。则w[j,i]=c[i]-c[j-1]-sumw[j-1]*(sumd[i]-sumd[j-1])。特别的,当i=j时w[j,i]=0。 综上可知,求出所有sumw[i],sumd[i]与c[i]的时间复杂度为O(n),此后求任意w[j,i]的时间复杂度都为O(1)。 设f[i]表示在第i棵树处建立第二个锯木场的最小费用,则有。直接用这个式子计算的时间复杂度为,由于问题规模太大,直接使用这一算法必然超时,因此我们必须对算法进行优化。在讨论如何进行优化以前,我们首先证明下面这一猜想。 [猜想] 如果在位置建设第二个锯木,第一个锯木的位置是时最优那么如果在位置建设锯木,第一个锯木 即求f[i+1]时,决策k比决策j来得差!因此,当f[i]的第一个最佳决策为j时,f[i+1]的第一个最优决策必大于等于j! 证毕! 【算法的改进】 令s[k,i]表示决策变量取k时f[i]的值,即s[k,i]=c[k]+w[k+1,i]+w[i+1,n+1]。 设k1k2,则有s[k1,i]-s[k2,i] =(c[k1]+w[k1+1,i]+w[i+1,n+1])-(c[k2]+w[k2+1,i]+w[i+1,n+1]) =(c[k1]+c[i]-c[k1]-sumw[k1]*(sumd[i]-sumd[k1]) - (c[k2]+c[i]-c[k2]-sumw[k2]*(sumd[i]-sumd[k2]) =sumw[k2]*(sumd[i]-sumd[k2])- sumw[k1]*(sumd[i]-sumd[k1]) =sumd[i](sumw[k2]-sumw[k1])-(sumw[k2]*sumd[k2]-sumw[k1]*sumd[k1]) 若s[k1,i]-s[k2,i]0,则有: sumd[i](sumw[k2]-sumw[k1])(sumw[k2]*sumd[k2]-sumw[k1]*sumd[k1]) 即(sumw[k2]*sumd[k2]-sumw[k1]*sumd[k1])/ (sumw[k2]-sumw[k1]) sumd[i] 或(sumw[k1]*sumd[k1]-sumw[k2]*sumd[k2])/ (sumw[k1]-sumw[k2]) sumd[i] 我们令g[k1,k2]=不等式左边,当g[k1,k2]sumd[i]时s[k1,i]-s[k2,i]0。 由上面已经证明的猜想,说明决策变量j是单调的,(即f[i+1]的决策j2必大于等于f[i]时的决策j1)此时问题就好解决了。我们可以维护一个特殊的队列k,这个队列只能从队尾插入,但是可以从两端删除。这个队列满足k1k2k3…kp以及g[k1,k2]g[k2,k3]…g[kp-1,kp]。 1.计算状态f[i]前,若g[k1,k2]sumd[i],表示s[k1,i]-s[k2,i]0,即决策k1没有k2优,应当删除队

文档评论(0)

sh4125733 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档