HDU 4652 Dice (概率DP)

Dice

Problem Description

You have a dice with m faces, each face contains a distinct number. We assume when we tossing the dice, each face will occur randomly and uniformly. Now you have T query to answer, each query has one of the following form:

0 m n: ask for the expected number of tosses until the last n times results are all same.

1 m n: ask for the expected number of tosses until the last n consecutive results are pairwise different.

Input

The first line contains a number T.(1≤T≤100) The next T line each line contains a query as we mentioned above. (1≤m,n≤106) For second kind query, we guarantee n≤m. And in order to avoid potential precision issue, we guarantee the result for our query
will not exceeding 109 in this problem.

Output

For each query, output the corresponding result. The answer will be considered correct if the absolute or relative error doesn‘t exceed 10-6.

Sample Input

6
0 6 1
0 6 3
0 6 5
1 6 2
1 6 4
1 6 6
10
1 4534 25
1 1232 24
1 3213 15
1 4343 24
1 4343 9
1 65467 123
1 43434 100
1 34344 9
1 10001 15
1 1000000 2000

Sample Output

1.000000000
43.000000000
1555.000000000
2.200000000
7.600000000
83.200000000
25.586315824
26.015990037
15.176341160
24.541045769
9.027721917
127.908330426
103.975455253
9.003495515
15.056204472
4731.706620396

Source

2013 Multi-University Training Contest 5

题目大意:

n边形的骰子,问你出现连续相同(不同)n次需要掷的次数的数学期望。

解题思路:

利用递归方式的DP的思想推公式

(1)若询问为0,则:

dp[i] 记录的是已经连续i个相同,到n个不同需要的次数的数学期望

dp[0]= 1+dp[1]

dp[1]= 1+( 1/m*dp[2]+(m-1)/m*dp[1])=1+(dp[2]+(1-m)*dp[1])/m;

dp[2]= 1+(dp[3]+(1-m)*dp[1])/m;

....................

dp[n]= 0

推出:

dp[i]   = 1 + ( (m-1)*dp[1] + dp[i+1] ) / m

dp[i+1] = 1 + ( (m-1)*dp[1] + dp[i+2] ) / m

因此,m*(dp[i+1]-dp[i])=(dp[i+2]-dp[i+1])

我们发现是等比数列

dp[0]-dp[1]=1;

dp[1]-dp[2]=m;

..........

dp[n-1]-dp[n]=m^(n-1)

累加,得:dp[0]-dp[n]=1+m+m^2+..........m^(n-1)=(1-m^n)/(1-m)

所以:dp[0]=(1-m^n)/(1-m);

(2)若询问为1,则:

dp[0] = 1 + dp[1]

dp[1] = 1 + (dp[1] + (m-1) dp[2]) / m

dp[2] = 1 + (dp[1] + dp[2] + (m-2) dp[3]) / m

dp[i] = 1 + (dp[1] + dp[2] + ... dp[i] + (m-i)*dp[i+1]) / m

dp[i+1]= 1 + (dp[1] + dp[2] + ... dp[i] + dp[i+1] + (m-i-1)*dp[i+1]) / m

...

dp[n] = 0;

选出 dp[i] 和 dp[i+1] 这两行相减 得

dp[i] - dp[i+1] = (m-i-1)/m * (dp[i+1] - dp[i+2]);

因此  dp[i+1] - dp[i+2] = m/(m-i-1)*(dp[i]-dp[i+1]);

所以:

dp[0]-dp[1]=1;

dp[1]-dp[2]=1*m/(m-1);

dp[2]-dp[3]=1*m/(m-1)*m/(m-2);

..........

dp[n-1]-dp[n]=1*m/(m-1)*m/(m-2)*.......*m/(m-n+1);

累加得到答案

解题代码:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

inline double solve(){
    int op,m,n;
    scanf("%d%d%d",&op,&m,&n);
    double ans=0;
    if(op==0){
        for(int i=0;i<=n-1;i++){
            ans+=pow(1.0*m,i);
        }
    }else{
        double tmp=1.0;
        for(int i=1;i<=n;i++){
            ans+=tmp;
            tmp*=m*1.0/(m-i);
        }
    }
    return ans;
}

int main(){
    int t;
    while(scanf("%d",&t)!=EOF){
        while(t-- >0){
            printf( "%.9lf\n",solve() );
        }
    }
    return 0;
}

HDU 4652 Dice (概率DP),布布扣,bubuko.com

时间: 2024-10-05 22:27:36

HDU 4652 Dice (概率DP)的相关文章

HDU 4652 Dice (概率DP)

B - Dice Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4652 Description You have a dice with m faces, each face contains a distinct number. We assume when we tossing the dice, each face will o

HDU 4599 Dice (概率DP+数学+快速幂)

题意:给定三个表达式,问你求出最小的m1,m2,满足G(m1) >= F(n), G(m2) >= G(n). 析:这个题是一个概率DP,但是并没有那么简单,运算过程很麻烦. 先分析F(n),这个用DP来推公式,d[i],表示抛 i 次连续的点数还要抛多少次才能完成.那么状态转移方程就是 d[i] = 1/6*(1+d[i+1]) + 5/6*(1+d[1]), 意思就是说在第 i 次抛和上次相同的概率是1/6,然后加上上次抛的和这一次,再加上和上次不同的,并且又得从第1次开始计算. 边界就是

hdu 4870 Rating(概率DP&amp;高数消元)

Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 714    Accepted Submission(s): 452 Special Judge Problem Description A little girl loves programming competition very much. Recently, she

HDU 4035Maze(概率DP)

HDU 4035   Maze 体会到了状态转移,化简方程的重要性 题解转自http://blog.csdn.net/morgan_xww/article/details/6776947 /** dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 (概率为ei) 3.和该点相连有m条边,随机走一条 求:走出迷宫所要走的边数的期望值. 设 E[i]表示

HDU 3853 LOOPS (概率dp)

LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Submission(s): 2931    Accepted Submission(s): 1209 Problem Description Akemi Homura is a Mahou Shoujo (Puella Magi/Magical Girl). Homura wants to help

Throwing Dice(概率dp)

C - Throwing Dice Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu LightOJ 1064 uDebug Description n common cubic dice are thrown. What is the probability that the sum of all thrown dice is at least x? Input Input starts wit

HDU 4089 Activation (概率dp 好题 + 难题)

Activation Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1842    Accepted Submission(s): 689 Problem Description After 4 years' waiting, the game "Chinese Paladin 5" finally comes out.

HDU - 1099 - Lottery - 概率dp

http://acm.hdu.edu.cn/showproblem.php?pid=1099 最最简单的概率dp,完全是等概率转移. 设dp[i]为已有i张票,还需要抽几次才能集齐的期望. 那么dp[n]=0,因为我们已经集齐了. \[dp[i]=(\frac{i}{n}*dp[i]+\frac{n-i}{n}*dp[i+1])+1\] 移项得答案. 然后写个分数类,注意约分. #include<bits/stdc++.h> using namespace std; typedef long

hdu 5001 walk 概率dp入门题

Description I used to think I could be anything, but now I know that I couldn't do anything. So I started traveling. The nation looks like a connected bidirectional graph, and I am randomly walking on it. It means when I am at node i, I will travel t