Alice 與 Bob 的遊戲 (概率DP

2021-08-06 07:00:10 字數 1610 閱讀 6491

題目描述

alice 和 bob 兩個人正在玩乙個遊戲,遊戲有很多種任務,難度為 p 的任務(p是正整數),有 1/(2^p) 的概率完成並得到 2^(p-1) 分,如果完成不了,得 0 分。一開始每人都是 0 分,從 alice 開始輪流做任務,她可以選擇任意乙個任務來做;而 bob 只會做難度為 1 的任務。只要其中有乙個人達到 n 分,即算作那個人勝利。求 alice 採取最優策略的情況下獲勝的概率。

輸入格式

乙個正整數 n ,含義如題目所述。

輸出格式

乙個數,表示 alice 獲勝的概率,保留 6 位小數。

樣例資料 1

輸入 1

輸出 0.666667

備註 【資料範圍】

對於 30% 的資料,n≤10

對於 100% 的資料,n≤500

由題意可知:

1、只要有一人的分數大於等於n就勝出;

2、對於alice 每次選分數為k的任務,成功的概率為 1/2*k,失敗的概率為(1-1/2*k);

3、對於bob 每次只能選分數為1的任務,成功與失敗的概率均為 1/2。

首先確定狀態,f[i][j] 為alice 為 i 分,bob 為 j 分,alice要取勝的概率;

然後我們發現可以倒著往前推,先初始化 f[n] =1,然後由f[n][n] 每次減乙個分數;

每次做任務分四種情況:

1、alice 選擇 得分為 k 的任務,成功,bob 選擇得分為1的任務,也成功了,則:

—-f[ii][j]=f[i+k][j+1]/2*k/2;

2、alice 選擇 得分為 k 的任務,成功,bob 選擇得分為1的任務,但沒有成功則:

—f[i][j]=f[i+k][j]/2*k/2;

3、alice 選擇 得分為 k 的任務,沒有成功,bob 選擇得分為1的任務,成功了,則:

—-f[i][j]=f[i][j+1]*(1-1/2*k)/2;

4、alice 選擇 得分為 k 的任務,沒有成功,bob 選擇得分為1的任務,也沒成功了,則:

—–f[i][j]=f[i][j]*(1-1/2*k)/2;

f[i][j] 的值就等於上面四項之和 ,化簡的方程:

f[i][j]=(f[l][j+1]/k/4+f[l][j]/k/4+f[i][j+1](k*2-1)/k/4)/(1.0-1.0(k*2-1.0)/k/4);

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define esp 1e-8

using

namespace

std;

int n;

double f[505][505],tmp,val;

//---------------------

int main()

f[i][j]=val;

}cout.setf(ios::fixed);

cout

<6)<0][0]0;}

Alice和Bob賭糖果 概率 經典

alice和bob賭糖果。規則是這樣的 alice從 l,r 中隨機抽乙個數,bob從 l,r 中隨機抽乙個數,誰抽的數大誰就贏,輸的一方給另一方1顆糖 平局不用給糖 他們會一直賭下去直到有一方沒有糖果為止。alice有n顆糖果,bob有m顆糖果,求alice將bob的糖果贏完的概率。第一行3個整數...

Alice和Bob賭糖果 概率 經典

alice和bob賭糖果。規則是這樣的 alice從 l,r 中隨機抽乙個數,bob從 l,r 中隨機抽乙個數,誰抽的數大誰就贏,輸的一方給另一方1顆糖 平局不用給糖 他們會一直賭下去直到有一方沒有糖果為止。alice有n顆糖果,bob有m顆糖果,求alice將bob的糖果贏完的概率。第一行3個整數...

4730 Alice和Bob又在玩遊戲

time limit 40 sec memory limit 1024 mb submit 116 solved 52 submit status discuss alice和bob在玩遊戲。有n個節點,m條邊 0 m n 1 構成若干棵有根樹,每棵樹的根節點是該連通塊內編號最 小的點。alice和...