动态规划之轮船租用问题(思考分析、解决、算法模板)

一、问题描述:

  长江游艇俱乐部在长江上设置了n个游艇出租站1,2,3…,n。

  游客可以在这些游艇出租站用游艇,并在下游的任何一个游艇出租站归还游艇。

  游艇出租站i到游艇出租站j之间的租金为r(i,j),1<=i<j=n。

  试设计一个算法,计算从游艇出租站1到出租站n所需的最少租金。

数据输入:

  第一行表示有n个站点。 

  接下来n-1行是r( i ,  j)。

  输入示例(有3个站点,从 1 到 2 要 5,从 1 到 3 要 15,从 2 到 3 要 7):

    3

    5  15

    7

数据输出:

  输出最从游艇出租站1到出租站n所需的最少租金。

二、问题分析:

1、首先因为它是贪心算法无法解决的最优问题,因此可以判断为动态规划求解。为什么贪心算法不行?假设在第i个出租站能选择的下一个出租站有n-i个,当我们要走到第n个出租站的时候,用贪心智能选出当前情况下的最优值,但是在该方案(当前最优)选择后,可能后续的花费更高,因此就导致该方案不是最优解。

2、子问题分析

最优子结构证明:对于最有方案T1 ... i ... j ... n)而言,其中i->j 必定是ij码头的最优解,为什么呢?因为假设该i->j(记Z1)不是最优解,那么就存在一个是i->j的最优解(Z2),让该解Z2来替换Z1,那么最终的方案T'必定比T花费的更少。

3、通项、出口、起调、转移

首先:m=2的情况,即只有两个出租站。A-B则是直接直达。

考虑m=3的情况,即有A B C 三个出租站,那么AC的最优是什么情况?枚举方案(1A-B + B-C2A-C,此时发现子问题即是A-B的距离加上B-C的距离。

考虑m=4的情况,即A B C D四个出租站,那么AD的最优是什么情况?枚举方案(1A-B + B-C + C-D2A-B + B-D 3....

此时,子问题变成了A-B B-C C-DA-B B-D的最短路径情况,因为是最优子结构,故这些自问题应该也是最优的!

那么开始考虑“重叠子问题”对于方案(2B-D的距离即是方案(1B-C C-D方案(2B-D的最优情况。即对于A-D的求解包括了B-D的求解。因此可以将其保存下来。

由此变成了dpB】【D】的距离。

三、问题解决:

核心代码   
 for(int l=2;l<=n;l++){
        //出租站间的长度
        for(int i=1;i<=n-l+1;i++){
            int j=i+l-1;
            for(int k=i+1;k<j;k++){
                int temp=r[i][k]+r[k][j];
                if(temp<r[i][j])
                    r[i][j]=temp;
            }
        }
    }

 

 

posted @ 2021-01-04 19:17  An_One  阅读(523)  评论(0)    收藏  举报