游艇租用问题
问题描述
长江游艇俱乐部在长江上设置了n个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),1i<jn。试设计一个算法,计算出从游艇出租站1到游艇出租站n所需的最少租金。
编程任务
对于给定的游艇出租站i到游艇出租站j之间的租金为r(i,j),1i<jn,编程计算从游艇出租站1到游艇出租站n所需的最少租金。
数据输入
由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n<=200),表示有n个游艇出租站。接下来的n-1行是r(i,j),1i<jn。
(例如:
3
5 15
7
表示一共有3个出租站点,其中
第1个站点到第2个的租金为5
第1个站点到第3个的租金为15
第2个站点到第3个的租金为7
)
结果输出
程序运行结束时,将计算出的从游艇出租站1到游艇出租站n所需的最少租金输出到文件output.txt中。
输入文件示例 | 输出文件示例 |
---|---|
input.txt | output.txt |
3 | 12 |
5 15 | |
7 | |
input.txt | output.txt |
4 | 15 |
3 7 19 | |
5 13 | |
8 |
c++代码
#include<iostream>
#include<ctime>
#include<cstdlib>
#pragma warning(disable:4996)
using namespace std;
int func(int **r,int n) {
int x[2]; //定义2个数x[0]储存n-1和n站的最少租金
x[0] = r[0][1];
for (int i = 2; i < n; i++) {
int a = r[0][i]; //从起点到n站需要的租金
int b = x[0] + r[i-1][i]; //从n-1站到n站需要的租金
x[1] = a < b ? a : b; //从a、b中取最小值
x[0] = x[1];
}
return x[1]; //返回第n站的最小租金
}
int main() {
int n;
if (freopen("C:\\Users\\11590\\Desktop\\input.txt", "r", stdin) == NULL)
cout << "输入文件打开失败" << endl;
cin >> n;
int** r = new int* [n];
for (int i = 0; i < n; i++) {
r[i]= new int[n];
}
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
cin >> r[i][j];
if (freopen("C:\\Users\\11590\\Desktop\\output.txt", "w", stdout) == NULL)
cout << "输出文件打开失败" << endl;
cout <<func(r,n)<< endl;
for (int i = 0; i < n; i++) {
delete[]r[i];
}
delete[]r;
fclose(stdin);
fclose(stdout);
}