DP[K日][部屋N][Bビット] = K日が経過した部屋NのBビット目が1になっている確率。
class KingXMagicSpells { public: double expectedNumber(vector <int> D, vector <int> S1, vector <int> S2, int K) { const int N = D.size(); const int B = 30 + 1; ++K; double dp[K][N][B]; fill(&dp[0][0][0], &dp[K - 1][N - 1][B], 0); for (int i = 0; i < N; ++i) { for (int j = 0; j < B; ++j) { dp[0][i][j] = (bool)(D[i] & (1 << j)); } } // spell1 : xor // spell2 : move for (int day = 0; day + 1 < K; ++day) { for (int room = 0; room < N; ++room) { for (int bit = 0; bit < B; ++bit) { if (S1[room] & (1 << bit)) { dp[day + 1][room][bit] += (1.0 - dp[day][room][bit]) * 0.5; } else { dp[day + 1][room][bit] += dp[day][room][bit] * 0.5; } dp[day + 1][S2[room]][bit] += dp[day][room][bit] * 0.5; } } } double ret = 0; for (int i = 0; i < B; ++i) { ret += dp[K - 1][0][i] * (1 << i); } return ret; } };
0 件のコメント :
コメントを投稿