题目描述
长江游艇俱乐部在长江上设置了 n 个游艇出租站 1,2,⋯,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站 i到游艇出租站 j之间的租金为 r(i,j)(1≤i<j≤n)。试设计一个算法,计算出从游艇出租站 1 到游艇出租站 n 所需的最少租金。
输入格式
第一行中有一个正整数 n,表示有 n 个游艇出租站。接下来的 n-1 行是一个半矩阵 r(i,j)(1≤i<j≤n)。
输出格式
输出计算出的从游艇出租站 1 到游艇出租站 n 所需的最少租金。
解体思路:
因为第一行输入的是第一个游艇出租站到后面各个游艇出租站的租金,所以先将第一行的数据保存在最小价格f[i]中。然后对应列,按行遍历,再相加比较。也就是到前一站的最小价格加上到下一站的价格,再与当前最小价格比较,来考虑最优解。得出状态转移方程,f[j] = min(f[i-1]+a[i-1][j],f[j])。
代码如下:
#include <iostream>
#include <cmath>
using namespace std;
int a[205][205],n,f[205];
int main()
{
int i,j;
cin >> n;
for ( i = 1; i < n; i++)
{
for (j = i + 1; j <=n; j++)
{
cin >> a[i][j];
}
}
for (j = 1; j <= n; j++)
f[j] = a[1][j];
for ( j = 2; j <= n; j++)
{
for ( i = 2; i <= j; i++)
{
f[j] = min(f[i-1]+a[i-1][j],f[j]);
}
}
cout << f[n];
return 0;
}