ZOJ 3022 数学题

将对几个的概率记录下来,然后依次递推

#include <cstdio>
#include <cstring>

int n;
double dp[2][20];

void solve()
{
    char str[20];
    memset(dp, 0, sizeof(dp));
    int i, j, k, wc, kc;
    wc = kc = 0;
    dp[0][n] = 1;
    int now = 0, next = 1;
    while (true)
    {
        scanf("%s", str);
        if (str[0] == 'E') break;
        for (i = 0; i <= n; ++i)
        {
            j = n - i;
            if (str[0] == 'W')
            {
                if (wc >= n) break;
                if (i > 0) dp[next][i - 1] += dp[now][i] * i / (n - wc);
                dp[next][i] += dp[now][i] * (j - wc) / (n - wc);
            }
            else if (str[0] == 'K')
            {

                if (kc >= n) break;
                if (j > 0) dp[next][i + 1] += dp[now][i] * j / (n - kc);
                dp[next][i] += dp[now][i] * (i - kc) / (n - kc);
            }
        }
        if (i != n + 1) continue;
        if (str[0] == 'W') {wc++; kc = 0;}
        else if (str[0] == 'K') {kc++; wc = 0;}
//        for (i = 0; i <= n; ++i)
//            printf("%.2f  ", dp[next][i]);
//        printf("\n");
        now ^= 1; next ^= 1;
        memset(dp[next], 0, sizeof(dp[next]));
    }
    printf("%.2lf\n", dp[now][n]);
}


int main()
{
    while (scanf("%d", &n) != EOF)
    {
        solve();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值