套利[题目][j2]

题目描述

套利是利用货币汇率差异将一种货币单位转换成一种以上相同货币单位。例如,假设1美元买入0.5英镑,1英镑买入10.0法国法郎,1法国法郎买入0.21美元。然后,通过转换货币,聪明的交易者可以从1美元开始,买入0.5 * 10.0 * 0.21 = 1.05美元,获利5%。
您的工作是编写一个程序,该程序将货币汇率列表作为输入,然后确定是否可以进行套利。

输入

第一行中,有一个整数n(1 <= n <= 30),代表不同货币的数量。
      接下来的n行分别包含一种货币的名称。名称中不会出现空格(货币名称可能会重复)
       下一行包含一个整数m,代表要遵循的表的长度。最后m行分别包含源货币的名称ci,

代表ci到cj的汇率的实数rij和目标货币的名称cj。没有出现在表中的交换是不可能的

(可能存在同币种不同汇率情况,保留汇率高的情况)

输出

yes或no的格式打印一行,说明是否可以套利。

样例输入

3
USDollar
BritishPound
FrenchFranc
3
USDollar 0.5 BritishPound
BritishPound 10.0 FrenchFranc
FrenchFranc 0.21 USDollar

样例输出

yes

算法:弗洛伊德

弗洛伊德:

弗洛伊德Floyd算法 ,是用来求所有顶点到所有顶点的最短路径。

我们可以直接对每个顶点通过迪杰斯特拉算法求得所有的 顶点到所有顶点的最短路径,为什么还要弗洛伊德算法?

弗洛伊德算法-动态规划思想

定义状态,划分阶段

1、我们设 d[k][i][j] 为除了 i 和 j 外只经过前 k 个结点,从 i 到 j 的最短路。

2、显然可以知道 d[0][i][j]=w[i][j]

3、那么当加入了一个顶点k之后,最短路如果有变化的话一定是以k为中间顶点, 那么可以得到: d[k][i][j] = min(d[k−1][i][j],d[k−1][i][k] +d[k−1][k][j])

4、这个算法的复杂度是O(|V|3)

最优子结构 

最短路径的子路径仍然是最短路径,最优子结构可以保证

最短路径的子路径仍然是最短路径

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值