TopCoder SRM 642 Div1 Easy: WaitingForBus (DP・期待値)
解法
動的計画法(渡すDP)。dp[t]:= 時刻tに出発できる確率を計算しておく。
コード
public class WaitingForBus { private final int MAX_TIME = 200001; public double whenWillBusArrive(int[] time, int[] prob, int s) { int N = time.length; double[] dp = new double[MAX_TIME]; dp[0] = 1.0; for (int t = 0; t < s; t++) { for (int bus = 0; bus < N; bus++) { if (t + time[bus] < MAX_TIME) { dp[t + time[bus]] += (double) dp[t] * prob[bus] / 100; } } } double ans = 0; for (int t = s; t < MAX_TIME; t++) { ans += dp[t] * (t - s); } return ans; } }