月(確率dp)

序文

この質問は、2018 CCPC Jilin DivisionのCの質問で、ブロンズdpの質問です。

題名

ゲームをプレイする確率がありますq = 2%q = 2 \%q=2 、次に所定の確率p%p \%p ゲームの各ラウンドで、勝つ確率はp%p \%です。p 、あなたが勝てなかった場合、q = q + 1.5%q = q + 1.5 \%q=q+1 5 %が、ゲームを続けます。当選すると抽選となり、当選確率はq%q \%q 、描画されている場合にゲームが停止している場合、描画されていない場合はq = q + 2%q = q + 2 \%q=q+2 、ゲームを続行します。ゲームのラウンド数に対する期待を見つけます。

アイデア

確率dpの一般的な方法は、状態機械の観点からそれを考慮することです。f(i)f(i)f i は、描画の初期確率がi / 100 i / 100であることを意味しますI / 。1 0 0、ラウンド数の期待値。以下の分類の議論。
ゲームのこのラウンドが勝った場合、2つの状況で考慮されます。宝くじに当たった場合、ゲームは終了し、ラウンド数は増加しません。状態遷移方程式は、f(i)= p ∗(i / 100)f(i)= p *(i / 100)です。f =pi / 1 0 0 ;描画しない場合、ゲームラウンドの数に1を足して次の状態に移行すると、遷移方程式はf(i)= p ∗(1 − i / 100)∗ f(min(i + 2、100))f(i)= p *(1-i / 100)* f(min(i + 2,100))f =p1i / 1 0 0 f m i n i+2 1 0 0
ゲームのこのラウンドで勝利しなかった場合、次のラウンドに直接進みます。状態遷移方程式はf(i)=(1 − p)∗(1 + f(min(i + 1.5)、100))です。 f(i)=(1-p)*(1 + f(min(i + 1.5)、100))f =1p 1+f m i n i+5 1 0 0
状態遷移方程式が確立された、最初にq = 100%q = 100 \%の場合、初期状態を考慮しますq=1 0 0 、勝つ限り直接停止するため、問題は超幾何分布に変換され、期待値は1 / p 1 / pです。1 / P
逆の順序で押した後、f(2)f(2)f 2 が必要です。

コード

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

const int N = 1010;

double f[N];

int main()
{
    
    
    int T;
    scanf("%d",&T);
    int cas = 0;
    while(T--){
    
    
        double p;
        scanf("%lf",&p);
        p /= 100;
        f[1000] = 1 / p;
        for(int i=999;i>=2;i--){
    
    
            f[i] = p * (i / 1000.0 + (1 - i / 1000.0) * (1 + f[min(i + 20, 1000)]));
            f[i] += (1 - p) * (1 + f[min(i + 15, 1000)]);
        }
        printf("Case %d: %.10f\n",++cas,f[20]);
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_43634220/article/details/108476440