序文
この質問は、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 (私)=p∗(i / 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 (私)=p∗(1−i / 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 (私)=(1−p )∗(1+f (m i n (i+1。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;
}