我是靠谱客的博主 听话口红,最近开发中收集的这篇文章主要介绍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)这个状态转移。

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

#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 Coins Gym - 101606F(概率DP)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部