此题的证明和公式可搞得够呛。。我是参考了以前的几分论文一起才搞懂的
PS:谁能告诉我在csdn中怎么插入公式啊。。。
首先我们定义几个变量:
Sw【i】=∑w【i】表示前i棵树的的总重量
Sd【i】=∑d【i】表示第一棵树到i棵树的距离其中Sd【1】=0; Sd【n+1】表示第一棵树到山脚锯木厂的距离
Cost【i】表示第i棵树的位置建立一个锯木厂,然后将前i-1棵树运送到次锯木厂的总花费
其中Cost【1】=0
Cost【i 】=Cost【i-1】+Sw【i-1】*d【i-1】(1 < i <=n )
然后这里我要解释下为什么锯木厂一定在第i棵树上建而不在中间建,因为题目有个限制说树木只能从山上运往山下
那么考虑如果有一个锯木厂在i与i+1之间,那么必然i+1的树木不能运到i位置,而只能往下一个运,那么第树木运到两树中间那个锯木厂和运送到某个树的锯木厂相比,花费的增量必然是前者大,所以我们可以得锯木厂必然在某个树位置上
然后现在用Trans【i,j】表示第 i到j棵树全部搬到第 j棵树位置上建立的锯木厂的总花费
Trans【i,j】=Cost【j】- Cost【i-1】-Sw【i-1】*(Sd【j】-Sd【i-1】)其中Sw【i-1】*(Sd【j】-Sd【i-1】)是因为有i-1棵树多算了i-1到j的价值
现在我们用F【i】表示将第二个锯木厂建造在第i棵树的位置上所花费的最小代价
F【i】=min{ Cost【j】+Trans【j+1,i】+Trans【i+1,n+1】 | 1<=j<i }
到这里已经可以算是一个dp方程了,但是这个复杂度任然是O(n^2)
然后我们继续往下走
用F【i,j】来表示第一个伐木场建设在j,第二个伐木场建设在i时的总代价
然后在这里我们要对单调性进行证明:
当有第二个伐木场建在i处时,如果最优值是在第一个锯木厂的j处时取到最优值,那么如果有第二个伐木场在i+1处时,此时的第一个伐木场的最优值不会在j位置之前取到,这也算是一个无后效性吧
证明如下(参考论文):
+++++++++++ J1 ++++++++++ J2 +++++++++++ i +++++++++
我们用数轴从左到右表示山上到山下,且J1<J2 同时F【i,J1】<F【i,J2】
F【i,j1】-F【i,j2】<0
等价于
=Cost【j1】+Trans【j1+1,i】+Trans【i+1,n+1】
-Cost【j2】-Trans【j2+1,i】-Trans【i+1,n+1】
=Cost【j1】+Cost【i】-Cost【j1】-Sw【j1】*(Sd【i】-Sd【j1】)
-Cost【j2】-Cost【i】+Cost【j2】+Sw【j2】*(Sd【i】-Sd【j2】)
=Sw【j2】*(Sd【i】-Sd【j2】)-Sw【j1】*(Sd【i】-Sd【j1】)
=Sw【j1】Sd【j1】-Sw【j2】Sd【j2】+Sw【j2】sd【i】-Sw【j1】Sd【i】<0
然后化成斜率形式
(Sw【j1】Sd【j1】-Sd【j2】Sw【j2】)/(Sw【j1】-Sw【j2】)>Sd【i】
通过这个我们可以得到对于F【i,j1】 与F【i,j2】的值比较只与j1,j2有关而与i无关。既然我们化成斜率的形式,那么我们将K【J1,J2】表示为斜率
即 K【J1,J2】>Sd【i】 则j1的方案优与j2 所以问题简化成我们对于每一个i在前面找J1,J2 而且答案就是F【i】=F【i,j1】
那么我们还是通过图画出来(图来自论文):
假设K【j1,j2】>Sd[i] ,K【j2,j3】<Sd【i】 则 F【i,j1】< F【i,j2】,F【i,j2】>F【i,j3】 通过图像发现j2输入上凸函数,而我们要找的是一个下凸函数的切线 即 F【i】=F【i,j1】
由于Sd是:Sd【i】=∑d【i】表示第一棵树到i棵树的距离其中Sd【1】=0; Sd【n+1】表示第一棵树到山脚锯木厂的距离
那么必然Sd【i】是单调递增的,对于给定j1,j2 在i增到一定时,最优值必然是下凸曲线的切线,然后这样就是斜率优化dp了