AOJ 0191 Baby Tree

方針

メモ化再帰.
memo[i][j] := j番目の肥料を直前に与え,i回目の肥料を与える時の成長度の最大値

ソースコード

double g[128][128];
double memo[128][128];

int n, m;

double dfs(int c, int prev)
{
    if(c == m)
        return 1.0;
    if(memo[c][prev] != -1)
        return memo[c][prev];

    double res = -1;

    for(int i = 0; i < n; i++)
        res = max(res, dfs(c + 1, i) * (c == 0 ? 1.0 : g[prev][i]));
        
    return memo[c][prev] = res;
}

int main()
{
    double ans;

    while(cin >> n >> m, n|m)
    {
        fill((double *)memo, (double *)(memo + sizeof memo / sizeof *memo), -1);

        for(int i = 0; i < n; i++)
            for(int j = 0; j < n; j++)
                cin >> g[i][j];

        printf("%.2lf\n", dfs(0, 0));
    }
}