AOJ0191 Baby Tree
解法
直前与えた肥料が何であるかが、今回に何を与えるのが最適であるかを決める。
よって、状態として「肥料を与えた回数」と「直前に与えた肥料」を持ち、成長率を最大化するDPをすればよい。
具体的には、k 日目に肥料 j を与えたときの成長率は、k-1 日目に肥料 i を与えていたとして、その上で 肥料 j を与えたという情報で更新出来る。よって3重ループで解ける。
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int N, M; while(cin >> N >> M && (N|M)) { vector<vector<double> > p(N, vector<double>(N, 0)); for(int i=0; i<N; i++) for(int j=0; j<N; j++) cin >> p[i][j]; vector<vector<double> > dp(M, vector<double>(N, 0)); for(int i=0; i<N; i++) dp[0][i] = 1.0; for(int k=1; k<M; k++) for(int i=0; i<N; i++) for(int j=0; j<N; j++) dp[k][j] = max(dp[k][j], dp[k-1][i]*p[i][j]); double res = 0.0; for(int i=0; i<N; i++) res = max(res, dp[M-1][i]); printf("%.2f\n", res); } return 0; }