我是靠谱客的博主 听话口红,这篇文章主要介绍Flipping Coins Gym - 101606F(概率DP),现在分享给大家,希望可以做个参考。

题意

有n个硬币,一开始都反面朝上,问连续k次从中选出1个并进行投掷,问最后正面朝上硬币的数学期望最大。

思路

每次选一个硬币进行投掷,最优的策略是选择反面朝上的进行投掷。那么可以设f(i,j)表示投掷i次j个硬币正面朝上的概率
选择反面朝上的进行投掷时,f(i, j) = f(i-1, j-1)/2 + f(i-1, j)/2
注意当j == n -1 这种状态可以由n全正这个状态转移。
当j == 0时候只能由f(i-1, 0)这个状态转移。

注意边界,和特殊的状态转移,还有初始状态。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 410; double f[maxn][maxn]; // f[i][j]表示抛i次硬币后有j枚硬币朝上的概率 int main() { // freopen("/Users/maoxiangsun/MyRepertory/acm/i.txt", "r", stdin); int n,k; while(~scanf("%d%d", &n,&k)) { f[0][0] = 1.0; for(int j = 1; j <= n; j++) f[0][j] = 0; for(int i = 1; i <= k; i++) { for(int j = 0; j <= n; j++) { if(j > 0)f[i][j] = f[i-1][j-1]/2 + f[i-1][j]/2; else f[i][j] = f[i-1][j]/2; if(j == n - 1) f[i][j] += f[i-1][n]/2; } } double ans = 0.0; for(int i = 1; i <= n; i++) { ans += i*f[k][i]; } printf("%.6fn", ans); } return 0; }

最后

以上就是听话口红最近收集整理的关于Flipping Coins Gym - 101606F(概率DP)的全部内容,更多相关Flipping内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部