Volume 1 / 0191

パソコン甲子園2008本選 解答

Problem 0191 : Baby Tree

a(1...m)回目に肥料i(0...n-1)を投入したときの最大成長率を記録していって、最終的にm回目で成長率が最大のものを出力する。

#include <iostream>
#include <iomanip>
#include <vector>
#include <limits.h>

using namespace std;


struct STATE {
	int id;
	double val;
};

vector<STATE> prev, next;
vector< vector<double> > g_table;
int n, m;

void init()
{
	prev.clear(); next.clear();
	prev.resize(n); next.resize(n);

	for( int i=0; i<n; i++ ){
		prev[i].id = i;
		prev[i].val = 1.0;
	}

	return;
}

double calc()
{
	int i, j, k;
	double new_val;
	double result;

	for( i=1; i<m; i++ ){
		for( j=0; j<n; j++ ){
			next[j].val = INT_MIN;
			for( k=0; k<n; k++ ){
				new_val = prev[k].val*g_table[prev[k].id][j];
				if( next[j].val < new_val ){
					next[j].val = new_val;
					next[j].id = j;
				}
			}
		}
		prev = next;
	}

	result = prev[0].val;
	for( i=1; i<n; i++ ){
		if( result < prev[i].val )
			result = prev[i].val;
	}

	return result;
}

int main(void)
{
	int i, j;
	double input;

	while( cin >> n >> m, n != 0 && m != 0 ){
		g_table.clear();
		g_table.resize(n);
		for( i=0; i<n; i++ )
			g_table[i].resize(n);

		for( i=0; i<n; i++ ){
			for( j=0; j<n; j++ ){
				cin >> input;
				g_table[i][j] = input;
			}
		}

		init();
		cout << setprecision(2) << setiosflags(ios::fixed);
		cout << calc() << endl;
	}

	return 0;
}