ある組みのスワップが起こる確率は 2.0 * (c / (n * c)) * (c / (n * c - 1.0))
ある交換で変化する期待値の差分は score[i] - score[j]
各箱に入っているキャンディーの数は言うまでもなく C
あとは、数値を S ターンだけ更新する。
こういう、"スワップした後"と"期待値"が出てくる問題の類はひどく苦手。
class CandyBox {
public:
vector <double> expectedScore(int C, vector <int> score_, int S)
{
vector<double> score(score_.begin(), score_.end());
if (S == 0) return score;
const int N = score.size();
double swap_prob = 0;
{
double c = C;
double n = N;
swap_prob = 2.0 * (c / (n * c)) * (c / (n * c - 1.0));
}
vector<double> dp[S + 1];
dp[0] = score;
for (int turn = 0; turn < S; ++turn) {
dp[turn + 1] = dp[turn];
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
dp[turn + 1][i] += (dp[turn][j] - dp[turn][i]) * swap_prob / C;
}
}
}
return dp[S];
}
};