AOJ 0191 - Baby Tree + 戯言
四捨五入がだめだったっぽい.ただprintf("%.2f", hoge)でいい.*1
DPが少しずつできるようになってきた.全探索を思い浮かべるといいかんじ.
はじめに肥料を肥料0として,次に肥料nをあげたときの倍率を1とすると,処理がちょっとだけ楽になるよー.
10^6回は超えないので,最初に選ぶ肥料をiとしてループ回してもいいっぽい.
#include<iostream> #include<cstdio> const double EPS = 1e-10; int n, m; //memo[i][j]: 直前にjを入れてi回目のときの最大倍率 //a[i][j]: 直前i double a[101][101], memo[101][101]; double rec(int i, int j){ if(memo[i][j] > -EPS){ return memo[i][j]; } if(i == m){ return 1; } double res = 0; for(int u=1;u<=n;u++){ res = std::max(res, a[j][u] * rec(i+1, u)); } return memo[i][j] = res; } int main(){ while(std::cin >> n >> m, n){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ std::cin >> a[i][j]; } } for(int i=1;i<101;i++){ a[0][i] = 1; } for(int i=0;i<101;i++){ for(int j=0;j<101;j++){ memo[i][j] = -1; } } printf("%.2f\n", rec(0, 0)); } }
余談: 岩手県(局所的)では新成人にKoboが配られるそうですね.
もし宮守女子に配られたらとかおもしろそうですね.
電波入らない姉帯さんとか「だるい」とか言って投げておく白望さんとかとか
*1:printfすごい