其他分享
首页 > 其他分享> > 租用游艇问题

租用游艇问题

作者:互联网

【题目描述】:

长江游艇俱乐部在江上设置了n 个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),1<=i<j<=n。试设计一个算法,计算出从游艇出租站1到游艇出租站n 所需的最少租金。

对于给定的游艇出租站i 到游艇出租站j之间的租金为r(i,j), 1<=i<j<=n,编程计算从游艇出租站1到游艇出租站n所需的最少租金。

【输入描述】:

第1 行中有1 个正整数n,表示有n个游艇出租站。接下来的n-1 行是r(i,j), 1<=i<j<=n。

【输出描述】:

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

【样例输入】:

3
5 15
7

【样例输出】:

12

【时间限制、数据范围及描述】:

时间:1s 空间:64M

n<=200

  分析: 这题显然是DP呀,怎么会是最短路呢???用f[i][j]表示第i个到第j个所要的最小花费,然后转移即可。   CODE:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<time.h>
 5 using namespace std;
 6 const int M = 200;
 7 int f[200][200];
 8 int dp(int n) {
 9     int i,j,k;
10     int t=n-1;
11     j=n;
12     for(i=n-2;i>=1;i--) {
13         for(k=t;k<=n-1;k++) {
14             if(f[i][j]>(f[i][k]+f[k][j])) {
15                 f[i][j]=f[i][k]+f[k][j];
16             } else {
17                 f[i][j]=f[i][j];
18             }
19         }
20         t--;
21     }
22     return f[1][n];
23 }
24 int main(){
25     //freopen("boat.in","r",stdin);
26     //freopen("boat.out","w",stdout);
27     int n;
28     cin>>n;
29     int j,k=2;
30     for(int i=1;i<=n-1;i++) {
31         for(j=k;j<=n;j++) {
32             cin>>f[i][j];
33         }
34         k++;
35     }
36     cout << dp(n) << endl;
37     return 0;
38 }

 

标签:200,int,游艇,问题,出租,租用,include,描述
来源: https://www.cnblogs.com/kanchuang/p/11188222.html