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 件のコメント :
コメントを投稿