算法实现题:3-9 租用游艇问题
题目略.
这个一个可用DP求解的问题。
N个游艇出租站,不妨从出发到终点分别编号0,2,……N-1
而且每两个站的租金都是不一样的,我们用r(i,j)表示每两个站之间的租金费用!现在我们要租用游艇从一个站的另外一个站,那么我们采取不同的停靠站策略就有不同的租金了!比如我们从第一个站到第三个站,租金是15元,但是我们看到第一个站到第二个站的租金只需5元,第二到第三个站的租金要7元,因此我们可用采用先到第二个站,把游艇归还,然后再从第二个站租用游艇到第三个站,因此我们总共需要的费用就是5+7=12元,比直接从第一个站到第三个站要花15元来得经济实惠!
现在我们的任务就是假设我们从第1个站到第n个站的,怎么才能使我们花的费用最少呢?
很明显这是一个优化问题,并且具有最优子结构, 表示前n-1个站的最优解,那么前n个站的最优解 一定包含前n-1个站的最优解,并且它们是具有重叠性的!因为该问题是一个DP问题。
=
根据该算法可用实现:
#include<iostream>
using namespace std;
#define N 201
int f[N][N];
int n;
void init()
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++) f[i][j]=0;
cout<<"请输入每两站之间的租金:"<<endl;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++) cin>>f[i][j];
}
void dyna()
{
for(int k=2;k<n;k++)
for(int i=0;i<n-k;i++)
{
int j=i+k;
for(int p=i+1;p<j;p++)
{
int temp=f[i][p]+f[p][j];
if(f[i][j]>temp) f[i][j]=temp;
}
}
}
int main()
{
cout<<"请输入游艇站的个数:";
cin>>n;
init();
dyna();
cout<<f[0][n-1]<<endl;
return 0;
}