[期望DP] SRM 579 Div1 Hard RockPaperScissors
2018-02-28 11:29
639 查看
SolutionSolution
E(x)=∑x∈AScore(x)×P(x)E(x)=∑x∈AScore(x)×P(x)只要考虑投了mm轮得到(r,p,s)(r,p,s)的概率和分数就好了。
概率可以这样DP。
ft,i,r,p,sft,i,r,p,s表示考虑前tt个骰子,ii没被丢出来,出了(r,p,s)(r,p,s)的概率。
时间复杂度O(n5)O(n5)。
hljs cpp">#define show(x) cerr << #x << " = " << x << endl using namespace std; typedef long long ll; typedef pair<int, int> Pairs; const int N = 51; inline char get(void) { static char buf[100000], *S = buf, *T = buf; if (S == T) { T = (S = buf) + fread(buf, 1, 100000, stdin); if (S == T) return EOF; } return *S++; } template<typename T> inline void read(T &x) { static char c; x = 0; int sgn = 0; for (c = get(); c < '0' || c > '9'; c = get()) if (c == '-') sgn = 1; for (; c >= '0' && c <= '9'; c = get()) x = x * 10 + c - '0'; if (sgn) x = -x; } int n; int a , b , c ; double q [4]; double f ; double ans; class RockPaperScissors { public: double bestScore(vector <int> Pr, vector <int> Pp, vector <int> Ps) { n = Pr.size(); for (int i = 1; i <= n; i++) { q[i][1] = (double)Pr[i - 1] / 300; q[i][2] = (double)Pp[i - 1] / 300; q[i][3] = (double)Ps[i - 1] / 300; } for (int i = 1; i <= n; i++) f[i][0][0][0] = 1; for (int t = 1; t <= n; t++) { for (int m = t; m >= 0; m--) for (int r = 0; r <= m; r++) for (int p = 0; p + r <= m; p++) { int s = m - r - p; double prob = (double)m / t; for (int i = 1; i <= n; i++) { f[i][r][p][s] *= (1 - prob); if (i == t) continue; if (r > 0) f[i][r][p][s] += f[i][r - 1][p][s] * prob * q[t][1]; if (p > 0) f[i][r][p][s] += f[i][r][p - 1][s] * prob * q[t][2]; if (s > 0) f[i][r][p][s] += f[i][r][p][s - 1] * prob * q[t][3]; } } } for (int r = 0; r < n; r++) for (int p = 0; p + r < n; p++) for (int s = 0; s + p + r < n; s++) { int m = r + p + s; double pr = 0, pq = 0, ps = 0; for (int i = 1; i <= n; i++) { double cur = f[i][r][p][s]; pr += cur * q[i][1]; pq += cur * q[i][2]; ps += cur * q[i][3]; } pr /= (n - m); pq /= (n - m); ps /= (n - m); ans += max(max(pr + ps * 3, pq + pr * 3), ps + pq * 3); } return ans; } };
相关文章推荐
- [DP 博弈] Topcoder SRM579 Div1. RockPaperScissors
- TopCoder SRM 653 Div2 Problem 500 - RockPaperScissorsMagicEasy (DP)
- Topcoder srm 653 div.2 500 - RockPaperScissorsMagicEasy(DP)
- [DP][拉格朗日插值][生成函数] SRM 629 Div1 Hard CandyDrawing
- [DP] SRM 452 Div1 Hard IncreasingNumber
- Topcoder SRM 663 Div2 Hard: CheeseRolling(状压DP)
- DP SRM 661 Div2 Hard: ColorfulLineGraphsDiv2
- 埃氏筛法+快速幂+dp SRM 660 Div 2 Hard: Powerit
- [DP] Topcoder SRM 552 DIV1 Hard. HolyNumbers
- [容斥 DP] Topcoder SRM 498 DIV1 Hard. FoxJumping
- [容斥原理][DP] SRM 498 Div1 Hard FoxJumping
- srm 655 div2 1000(DP进阶,枚举状态)
- TopCoder SRM 649 Div2 Problem 500 - CartInSupermarketEasy (区间DP)
- CodeForces 173A - Rock-Paper-Scissors 数学
- SRM 664 Div2 Hard: BearSortsDiv2(归并排序)
- HDU 6088 - Rikka with Rock-paper-scissors | 2017 Multi-University Training Contest 5
- TopCoder SRM 672 Div2 Problem 1000 - Tdetectived2 (状压dp)
- srm 308 div2 1000(DP, 离散背包+连续背包)
- POJ - 2339 Rock, Scissors, Paper
- 【Codeforces Round 331 (Div 2)D】【DP 记忆化搜索 期望DP区间性质 好题】Wilbur and Trees 砍树随机从右从左概率左倒右倒的期望底面覆盖长度