LightOJ 1030 概率DP求期望

2021-07-24 05:52:40 字數 1457 閱讀 4741

題意:
n個格仔,每個格仔有乙個值。從

1開始,每次扔6個面的骰子,扔出幾點就往前幾步,然後把那個格仔的金子拿走;

如果扔出的骰子+所在位置》n,就重新扔,直到在n;

問取走這些值的期望值是多少;

思路:
//格仔和值都是一樣,所以下述的話,值就是格仔,格仔就是值。。。比如這樣的9個格仔,我們總底往上來
對於第9個格仔,因為只有9,能取的期望就是9;
對於第8個格仔,8是一定要取的,而9也是一定回取的,所以對於第8個格仔,期望就是17;
對於第7個格仔,7是一定要取的,對於後面可能是直接取了9,或者先取8再取9,情況是滿足,對於每種情況概率是1/2,所以就是7+9/2+(8+9)/2=20;
ps:
上面的情況,在7後面的時候,我們可能取9,或者先取8,那麼其實就是拿了第8個格仔的期望和第9個格仔期望,期望就是能取的值,然後*概率,全部情況的總和就是新的期望,有人會奇怪那7呢?我們的前提是對於第7格一定拿7啊;
對於第6個格仔,那麼就是6一定要拿的,然後會拿7,拿8,拿9,他們的期望*概率的總和+他能取的值就是6的第6個格仔的期望;
...以此類推;
對於概率的其實一想更簡單...
我們一開始就在1,概率就是1,然後扔乙個骰子對於每個面的概率就是1/6,那麼dp[i]代表概率,每次對能到達的地方更新概率,最後期望就是值乘以概率的總和+1,1是一定要取的哦~
下面貼出直接求期望的code
#includeusing namespace std;

typedef __int64 ll;

const int n=1e2+10;

double dp[n];

double ans;

int main()

{ int t,cas=1;

scanf("%d",&t);

while(t--)

{int n,k;

double temp;

scanf("%d",&n);

for(int i=1;i<=n;i++)

scanf("%lf",&dp[i]);

for(int i=n-1;i>=1;i--)

{temp=0;

k=min(6,n-i);

for(int j=i+1;j

LightOJ 1030 概率DP求期望

題意 n個格仔,每個格仔有乙個值。從 1開始,每次扔6個面的骰子,扔出幾點就往前幾步,然後把那個格仔的金子拿走 如果扔出的骰子 所在位置 n,就重新扔,直到在n 問取走這些值的期望值是多少 思路 格仔和值都是一樣,所以下述的話,值就是格仔,格仔就是值。比如這樣的9個格仔,我們總底往上來對於第9個格仔...

LightOJ1030 數學概率與期望

題意 有乙個直線的金礦,每個點有一定數量的金子 你從 開始,每次扔個骰子,扔出幾點就走幾步,然後把那個點的金子拿走 如果扔出的骰子超出了金礦,就重新扔,知道你站在最後乙個點 問拿走金子的期望值是多少 首先我們假設你現在站在第 個點,且從這個點開始走 那麼這個點的期望p i p i 1 6 p i 2...

lightoj1104 數學概率與期望

題意 加入一年有n天 那麼至少有幾個人,可以保證至少兩個人同一天生日的概率大於等於0.5 思路 轉化一下題意 就是求所有人生日都不同的概率小於等於0.5 那麼至少兩個人同一天就是大於等於0,5 加入一年365天.那麼10個人全都不同天生日的概率就是 366 366 365 366 364 366 3...