博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 104 Arbitrage
阅读量:4919 次
发布时间:2019-06-11

本文共 1480 字,大约阅读时间需要 4 分钟。

UVA_104

    这个题目实际上是在求一个汇率乘积大于等于1.01的最小环。由于数据量不大,我们可以直接用动规+floyd解决,设f[i][j][k]为由i到j经过k次转换所能达到的最大汇率乘积,每循环一次k我们就扫描一遍f[i][i][k],如果有大于1.01的情况就直接打印结果即可。

    在记录路径时用path[i][j][k]记录第k次转换的初始位置,打印时采用递归的方式。

#include
#include
#define MAXD 30 #define MAXM 10010 int N, path[MAXD][MAXD][MAXD]; double f[MAXD][MAXD][MAXD]; void init() {
int i, j; memset(f, 0, sizeof(f)); for(i = 0; i < N; i ++) for(j = 0; j < N; j ++) if(i != j) {
scanf("%lf", &f[i][j][1]); path[i][j][1] = i; } } void printpath(int i, int j, int p) {
if(p == 0) printf("%d", i + 1); else {
printpath(i, path[i][j][p], p - 1); printf(" %d", j + 1); } } void floyd() {
int i, j, k, p; for(p = 1; p < N; p ++) {
for(k = 0; k < N; k ++) for(i = 0; i < N; i ++) for(j = 0; j < N; j ++) if(f[i][k][p] * f[k][j][1] > f[i][j][p + 1] + 1e-12) {
f[i][j][p + 1] = f[i][k][p] * f[k][j][1]; path[i][j][p + 1] = k; } for(i = 0; i < N; i ++) if(f[i][i][p + 1] > 1.01) {
printpath(i, i, p + 1); printf("\n"); return ; } } printf("no arbitrage sequence exists\n"); } int main() {
while(scanf("%d", &N) == 1) {
init(); floyd(); } return 0; }

转载于:https://www.cnblogs.com/staginner/archive/2011/10/25/2223469.html

你可能感兴趣的文章
【IE6的疯狂之二】IE6中PNG Alpha透明(全集)
查看>>
第一个Shell脚本
查看>>
C++ 小笔记
查看>>
Mysql 语句优化
查看>>
例子:进度条
查看>>
包含单引号的sql
查看>>
HTML 基础 2
查看>>
Java 最常见 200+ 面试题全解析:面试必备(转载)
查看>>
LinkedList
查看>>
Spring框架下PropertyPlaceholderConfigurer类配置roperties文件
查看>>
SQL查询优化
查看>>
使用子查询
查看>>
SD卡调试关键点
查看>>
Hadoop HBase Phoenix 版本
查看>>
深入Java集合学习系列:ConcurrentHashSet简单实现
查看>>
[原创]独立模式安装Hive
查看>>
Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1
查看>>
LeetCode My Solution: Minimum Depth of Binary Tree
查看>>
Objective-C中的Category(分类)
查看>>
浅谈python可迭代对象,迭代器
查看>>