uvaoj104

题意

几个国家的汇率已知,通过几次转换,使汇率超过1.01,赚便宜。这个题目和floyd原理很像,所以用动归里的floyed即可。代码如下

代码

#include<iostream>
#include<string.h>
#define N 25
using namespace std;

double dp[N][N][N];
int p[N][N][N];
int n;

void print(int i, int j, int s )
{
    if( s == -1)
    {
        cout << i + 1 ;
        return;
    }
    print( i, p[i][j][s],s - 1);
    cout << ' ' << j + 1 ;
    return;
}

void bfs()
{
    int s, m;
    for( s = 1; s < n; s++ )
    {
        for( int k = 0; k < n; k++ )
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++ )
                {
                    double temp = dp[i][k][s-1]*dp[k][j][0];              //第一次运行不通过,因为这里错了,dp[k][j][0],而不是dp[k][j][s-1]!!!
                    if (dp[i][j][s] < temp)
                    {
                        dp[i][j][s] = temp;
                        p[i][j][s] = k;
                    }
                }
        int i;
        for( i = 0; i < n; i++ )
            if( dp[i][i][s] > 1.01 )
        {
            m = i;
            break;
        }
       if( i < n)
        break;
    }
     if( s >= n)
        cout << "no arbitrage sequence exists" ;
    else
        print( m, m, s);
        cout << endl;
}

int main()
{
    while( cin >> n)
    {
        memset(dp,0,sizeof(dp));
        memset(p,0,sizeof(p));
        for(int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
        {
            if(i==j)
                dp[i][j][0]=1;
            else cin >> dp[i][j][0];
            p[i][j][0] = j;
        }

        bfs();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/cyno/p/4309819.html