问题描述:
江游乐俱乐部在长江上设置了n个游艇出租站,游客可以在这些游艇出租站用游艇,并在下游任何一个游艇出租站归还游艇,游艇出租站i到j之间的租金是r (i,j),其中1<=i<j<=n。
试设计一个算法,计算从游艇出租站1到出租站n所需的最少租金。
算法思想——动态规划:
每次都保存第0个出租站到第i(1<=i<=n)个出租站的最少租金,并不断更新。(代码中有详细的介绍)
参考样例:
输入:
3
5 12
6
输出:
11
其中,
3
一共有三个出租站
5 12
第一个出租站到第二个出租站的租金为5,第一个出租站到第三个出租站的租金为12.
6
第二个出租站到第三个出租站的租金为6.
11
5+6=11
最少租金:第一个出租站→第二个出租站→第三个出租站
代码如下:
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> arr[n - 1];//用向量数组来存放数据
/*
每一行存放的是第i个出租站到第i+j个出租站的租金(1<=i<j<=n)
例如:arr[0][0]存放的是第0个出租站到第0+1个出租站的租金
arr[1][1]存放的是第1个出租站到第1+2个出租站的租金
arr[3][4]存放的是第3个出租站到第3+5个出租站的租金
*/
for(int i = 0; i < n - 1; ++i){
for(int j = 0; j < n - i - 1; ++j){
int x;
cin >> x;
arr[i].push_back(x);
}
}
/*存放的是第0个出租站到第i(1<=i<=n)个出租站的最少租金
(dp[0]指的是第0个出租站到第1个出租站的最少租金)
*/
int dp[n - 1];
for(int i = 0; i < n - 1; ++i){
for(int j = 0; j < n - i - 1; ++j){
//先存放第0个出租站到其他出租站的租金
if(i == 0){
dp[j] = arr[i][j];
}
else{
/*
dp[i - 1]表示第0个出租站到第i-1个出租站的最少租金
arr[i][j]表示第i个出租站到第i+j个出租站的租金
该等式是在对现在的第0个出租站到第i+j个出租站的租金与以前存在dp数组中的租金进行比较,取最小值
*/
dp[i + j] = min(dp[i + j], arr[i][j] + dp[i - 1]);
}
}
}
cout << dp[n - 2] << endl;//输出最后一个元素,即第0个出租站到第n-1个出租站的最少租金
return 0;
}