题目描述:
长江游艇俱乐部在长江上设置了n个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),1<=i<j<=n。试设计一个算法,计算出从游艇出租站1 到游艇出租站n所需的最少租金。
输入格式:
第1 行中有1 个正整数n(n<=200),表示有n个游艇出租站。接下来的第1到第n-1 行,第i行表示第i站到第i+1站,第i+2站, … , 第n站的租金。
输出格式:
输出从游艇出租站1 到游艇出租站n所需的最少租金。
输入样例:
在这里给出一组输入。例如:
3
5 15
7
输出样例:
在这里给出相应的输出。例如:
12
代码示例:
#include<iostream>
using namespace std;
int r[100][100]={0};//r[i][j]是第i站到第j站的费用
int cost[100]={0};//costt[i]是第1站到第i站的最小费用
void sum(int n)
{
int i,k;
cost[1]=0;
for(i=2;i<=n;i++)
{
cost[i]=r[1][i];//5
for(k=2;k<=i;k++)
{
if(cost[i]>(cost[k]+r[k][i]))
cost[i]=cost[k]+r[k][i];
}
}
cout<<cost[n]<<endl;
}
int main()
{
int n;//n站
cin>>n;
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
cin>>r[i][j];//1,2 1,3 2,3
}
}
sum(n);
return 0;
}
解释:
假设此时n为3,则我们有三条路线,1->2,2->3,1->3
路线的长度分别是:5,7,15
一开始,我们会将1->各个点值先存起来,比如1->2和1->3
但是并不是1直接到各点距离最短,因为有近道时距离会更短
例如我们要从1->3,并不是直接走大路(1->3)更短,而是走两段小路(1->2,2->3)更短
由题可知:1->3 == 15 ,1->2 + 2->3 == 12,所以我们输出12
本题就是把路程看成租金即可,意思大差不差。