memo[ 4000 + 1 ][ 4000 + 1 ] だとメモリでアウト
赤を数千回連続で引く確率は十分小さいので、
memo[ 1000 + 1 ][ 4000 + 1 ] くらいでやればいい。
- const int R = 1000 + 1;
- const int B = 4000 + 1;
- double memo[R][B];
- double rec(int r, int b)
- {
- if (r < 0 || b < 0) return 0;
- double &ret = memo[r][b];
- if (ret != -1) return ret;
- if (r == 0 && b == 1) return ret = 1.0;
- if (r == 0 && b == 0) return 0;
- double p = 0;
- p += rec(r - 1, b - 1) * (double)r / (double)(r + b);
- p += rec(r, b - 2) * (double)b / (double)(r + b);
- return ret = p;
- }
- class MarblesInABag {
- public:
- double getProbability(int r, int b)
- {
- if (r < R && b < B) ; else return 0;
- fill(&memo[0][0], &memo[R - 1][B], -1);
- return rec(r, b);
- }
- };