AOJ0191 Baby Tree
問題リンク Baby Tree
- 解法
DPです。
dp[i][j]: i日目に肥料jを与えたときの最大成長度
という表を作ることができます。
初日は何を与えても成長度1なのでdp[0][i]は全て1です。
次の日以降は直前の日の状態から算出できます。
dp[i][j]を埋めたかったら、dp[i-1][k] * t[k][j]が最大となるものを探します。tは成長度の表です。
- ソース
import java.util.Scanner; //Baby Tree public class AOJ0191 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(true){ int n = sc.nextInt(); int m = sc.nextInt(); if((n|m)==0)break; double[][] t = new double[n][n]; for(int i=0;i<n;i++)for(int j=0;j<n;j++)t[i][j]=sc.nextDouble(); double[][] dp = new double[m][n]; for(int i=0;i<n;i++)dp[0][i]=1; for(int i=1;i<m;i++){ for(int j=0;j<n;j++){ for(int k=0;k<n;k++){ dp[i][j] = Math.max(dp[i][j], dp[i-1][k]*t[k][j]); } } } double a = 0; for(int i=0;i<n;i++)a=Math.max(a, dp[m-1][i]); System.out.printf("%.2f\n", a); } } }