Flipping Coins Gym - 101606F(概率DP)

题意

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

思路

每次选一个硬币进行投掷,最优的策略是选择反面朝上的进行投掷。那么可以设f(i,j)表示投掷i次j个硬币正面朝上的概率
选择反面朝上的进行投掷时,f(i-1, 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("%.6f\n", ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sunmaoxiang/article/details/87901565