租用游艇问题

   长江俱乐部在长江设置了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];
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值