长江俱乐部在长江设置了n个游艇出租站1,2,…n,游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇
出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),设计一个算法,计算出从出租站1到出租站n所需要
的最少租金。
解题思路:f(i, n) = min(f(i,j ) +f(j, k) + ..+f(k,n)) 。
public class RentYacht
{
int[][] cost = {
{0, 5, 11, 12}, // 1->2, 1->3
{5, 0, 7, 1}, // 2->3, 2->4
{11, 7, 0, 1}
};
// 计算从游艇出租站1到游艇出租站n所需的最少租金
int dyna(int[][] cost)
{
int n = cost[0].length; // 租出站个数
int money = cost[0][n-1]; // 初始租金
int sum = 0;
for (int i=0; i<n; i++)
{
sum = 0;
for (int j=i+1; j<n; j++)
{
sum += cost[i][j]; // i->j
for (int k=j+1; k<n; k++)
{
sum += cost[j][k]; // j->k
// 找到了租金更便宜的方式
if (sum < cost[i][k])
{
cost[i][k] = sum;
}
sum -= cost[j][k];
}
}
}
return cost[0][n-1];
}
}
int dyna(int[][] cost)
{
int n = cost[0].length; // 租出站个数
int sum = 0;
for (int k=2; k<n; k++)
{
for (int i=0; i<n-k; i++) // 起始站编号
{
int j = i + k; // 结束站编号
for (int p=i+1; p<j; p++)
{
sum = cost[i][p] + cost[p][j];
if (sum < cost[i][j])
cost[i][j] = sum;
}
}
}
return cost[0][n-1];
}