dp[何日目][何匹にマークした]
最初は、2^20 * 2^20 * 5 が思い浮かんで絶望した。
- class BirdsCounting {
- public:
- double computeProbability(int birds, int caught, int days, int marked)
- {
- const int B = 20 + 2;
- const int D = 5 + 2;
- double nCk[B][B];
- fill(&nCk[0][0], &nCk[B][0], 0);
- nCk[0][0] = 1;
- for (int n = 1; n < B; ++n) {
- nCk[n][0] = 1;
- for (int k = 1; k < B; ++k) {
- nCk[n][k] = nCk[n - 1][k - 1] + nCk[n - 1][k];
- }
- }
- double dp[D][B];
- fill(&dp[0][0], &dp[D][0], 0);
- dp[0][0] = 1;
- for (int d = 0; d < days; ++d) {
- for (int b = 0; b <= birds; ++b) {
- for (int i = 0; i <= caught; ++i) {
- if (b + i <= marked) ; else continue;
- if (0 <= caught - i) ; else continue;
- double p = nCk[birds - b][i] * nCk[b][caught - i] / nCk[birds][caught];
- dp[d + 1][b + i] += dp[d][b] * p;
- }
- }
- }
- return dp[days][marked];
- }
- };