牛客网专题 概率dp
文章目錄
- 概念:
- 例題
- 引入:
- 解答:
- Happy Running NC15532
- 題意:
- 題解:
- 代碼:
- poj2096 NC106693 Collecting Bugs
- 題意:
- 題解:
- 代碼:
- NC210477 帶富翁
- 題意:
- 題解:
- 代碼:
- NC210481 篩子游戲
- 題意:
- 題解:
- 代碼:
- NC210487 食堂
- 題意:
- 題解:
- 代碼:
- 習題
- CF148D Bag of mice
- CF16E Fish
- CF235B Let's Play Osu!
- NC14378 珂學送分
- NC20263 [SCOI2008] 獎勵關
- NC20709 Balls
- NC210515 迷宮游戲
- NC210516 抽卡
概念:
概率
期望:數學期望(mean)(或均值,亦簡稱期望)是試驗中每次可能結果的概率乘以其結果的總和,是最基本的數學特征之一。它反映隨機變量平均取值的大小。
例題
引入:
甲乙兩個人賭博,他們兩人獲勝的機率相等,比賽規則是先勝三局者為贏家,贏家可以獲得
100法郎的獎勵。當比賽進行到第四局的時候,甲勝了兩局,乙勝了一局,這時由于某些原
因中止了比賽,那么如何分配這100法郎才比較公平?
解答:
乙獲勝概率是1/4,甲是3/4,所以按照這個分錢
Happy Running NC15532
題意:
小明需要在操場順時針跑圈打卡,操場上有兩個打卡點A,B, 他需要先在A點打卡,然后在B點打卡(哪怕B點在A點前面),打完卡就可以結束跑步了,他的起點以及A,B兩點的位置是隨機的,告訴你操場的長度X米,求他需要跑超過K米的概率。
先輸入K,再輸入X
輸入:
? 輸出:
0.50 0.22 0.00題解:
固定起點,分類討論
情況1:
當A在B前:此時所跑距離小于等于一圈
列出相關式子:
K < X
A < B
B > = K
A < = x
B < = x
概率為圖中陰影部分占整個正方形
即
情況2:
A在B后:
情況3:
K == X時,(其實是求B在A前的概率)也就是0.5
代碼:
poj2096 NC106693 Collecting Bugs
題意:
題意:
一個軟件有s個子系統,會產生n種bug。
某人一天發現一個bug,這個bug屬于某種bug,發生在某個子系統中。
求找到所有的n種bug,且每個子系統都找到bug,這樣所要的天數的期望。
需要注意的是:bug的數量是無窮大的,所以發現一個bug,出現在某個子系統的概率是1/s,
屬于某種類型的概率是1/n。
? (0 < n, s <= 1 000)
? 輸入:
? 1 2
? 輸出:
? 3.00000
題解:
? f[i][j]表示現在已經找到的bug有i種,屬于j個系統,找完剩下所需bug的期望天數。
? 已知:f[n][s]=0,因為已經達到目標, 而要求的答案是f[0][0]
dp[i][j]狀態可以轉化成以下四種:
dp[i][j] 發現一個bug屬于已經找到的i種bug和j個子系統中
dp[i+1][j] 發現一個bug屬于新的一種bug,但屬于已經找到的j種子系統
dp[i][j+1] 發現一個bug屬于已經找到的i種bug,但屬于新的子系統
dp[i+1][j+1]發現一個bug屬于新的一種bug和新的一個子系統
以上四種的概率分別為:
p1 = i * j / (n * s)
p2 = (n-i) * j / (n * s)
p3 = i * (s-j) / (n * s)
p4 = (n-i)* (s-j) / (n * s)
又因為E(aA+bB+…) = aE(A) + bE(B)
所以dp[i,j] = p1 * dp[i,j] + p2 * dp[i+1,j] + p3 * dp[i,j+1] + p4 * dp[i+1,j+1] + 1;
dp[i,j] = ( 1 + p2 * dp[i+1,j] + p3* dp[i,j+1] + p4 * dp[i+1,j+1] )/( 1-p1 )
= ( n * s + (n-i) * j * dp[i+1,j] + i*(s-j) * dp[i,j+1] + (n-i) * (s-j) * dp[i+1 , j+1] )/( n * s - i * j )
代碼:
#include<iostream> #include<cstdio> #include<cstring>using namespace std;const int N=1010;double dp[N][N];int main(){//freopen("input.txt","r",stdin);int n,s;while(~scanf("%d%d",&n,&s)){dp[n][s]=0;for(int i=n;i>=0;i--)for(int j=s;j>=0;j--){if(i==n && j==s)continue;dp[i][j]=(i*(s-j)*dp[i][j+1]+(n-i)*j*dp[i+1][j]+(n-i)*(s-j)*dp[i+1][j+1]+n*s)/(n*s-i*j);}printf("%.4f\n",dp[0][0]);}return 0; }NC210477 帶富翁
題意:
? 小明在玩一款帶富翁游戲,這個游戲具體來說就是有n個獎勵點,每個獎勵點有一定的獎勵分。
一開始他站在位置1。每次他都會扔一個有6面的篩子,如果扔到了x,并且小明現在站在i這個位置,小明就會向前進x步到達i+x這個位置。
? 如果小明扔出了x并且i+x已經大于了n,那么小明就會重新扔,直到i+x在合適的位置。小明
最后如果到達了n號位置,那么小明就會結束游戲,現在小明想知道自己期望的得分是多少。
題解:
? f[i]表示從i走到n獲得的金子的期望,
? i+6 <= n 即不會走出去:f[i] = a[i] + ∑(1/6 * f[j]) ( i+1<=j<=i+6)
? i+6>n f[i] = (f[i + 1] + … + f[n]) / (n - i)。
代碼:
NC210481 篩子游戲
題意:
? 吉吉國王正在玩一款手游,這個手游的規則非常簡單。一開始你會得到三個篩子,三個篩子分別有k1,k2,k3面,也就是說分別可以扔出[1,k1],[1,k2],[1,k3]之間數。
? 一開始的分數為0,每次扔篩子都會扔出x,y,z三個數,但是這個游戲的特別之處在于每次開
局都會給定三個數a,b,c,如果滿足x=a,y=b,z=c,那么你的分數就會清零,否則你的分數就會加上x+y+z。現在吉吉國王想知道需要扔多少次才能使得他的分數大于n。 ? 0≤n≤500
題解:
? 設f[i]表示達到i分時到達目標狀態的期望,pk為投擲k分的概率,p0為回到0的概率,這個先預處理出來
? 則f[i]=∑(pk * f[i+k])+f[0 ] * p0+1
? f[i]=∑(pk * f[i+k])+f[0] * p0+1
? 每個狀態都和f[0]有關系,而且f[0]就是我們所求,為一個常數
? 設f[i]=A[i] * f[0]+B[i];
? 代入上述方程右邊得到:
? f[i]=∑(pk * A[i+k] * f[0]+pk * B[i+k])+f[0] * p0+1=
? (∑(pk* A[i+k])+p0)f[0]+∑(pk * B[i+k])+1;
? 所以 A[i]=(∑(pk* A[i+k])+p0) B[i]=∑(pk * B[i+k])+1
? 先遞推求得A[0]和B[0] 那么 f[0]=B[0]/(1-A[0]);
代碼:
NC210487 食堂
題意:
? 1≤k≤m≤n≤2000
題解:
? 設f[i][j]表示i個人排隊,Tomato排在第j個位置,達到目標狀態的概率(j<=i)
? f[n][m]就是所求
? j==1: f[i][1]=p1 * f[i][1]+p2 * f[i][i]+p4;
? 2<=j<=k: f[i][j]=p1 * f[i][j]+p2 * f[i][j-1]+p3 * f[i-1][j-1]+p4;
? k<j<=i: f[i][j]=p1 * f[i][j]+p2 * f [i][j-1]+p3 * f [i-1][j-1];
代碼:
習題
CF148D Bag of mice
CF16E Fish
CF235B Let’s Play Osu!
NC14378 珂學送分
NC20263 [SCOI2008] 獎勵關
NC20709 Balls
NC210515 迷宮游戲
NC210516 抽卡
總結
以上是生活随笔為你收集整理的牛客网专题 概率dp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 外斜视需要做什么检查
- 下一篇: spoj Favorite Dice(概