动态规划之轮船租用问题(思考分析、解决、算法模板)
一、问题描述:
长江游艇俱乐部在长江上设置了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、子问题分析
最优子结构证明:对于最有方案T(1 ... i ... j ... n)而言,其中i->j 必定是i到j码头的最优解,为什么呢?因为假设该i->j(记Z1)不是最优解,那么就存在一个是i->j的最优解(Z2),让该解Z2来替换Z1,那么最终的方案T'必定比T花费的更少。
3、通项、出口、起调、转移
首先:m=2的情况,即只有两个出租站。A-B则是直接直达。
考虑m=3的情况,即有A B C 三个出租站,那么A到C的最优是什么情况?枚举方案(1)A-B + B-C(2)A-C,此时发现子问题即是A-B的距离加上B-C的距离。
考虑m=4的情况,即A B C D四个出租站,那么A到D的最优是什么情况?枚举方案(1)A-B + B-C + C-D(2)A-B + B-D (3)....
此时,子问题变成了A-B B-C C-D;A-B B-D的最短路径情况,因为是最优子结构,故这些自问题应该也是最优的!
那么开始考虑“重叠子问题”对于方案(2)B-D的距离即是方案(1)B-C C-D方案(2)B-D的最优情况。即对于A-D的求解包括了B-D的求解。因此可以将其保存下来。
由此变成了dp【B】【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; } } }

浙公网安备 33010602011771号