[HDU4652] Dice

Posted Ngshily

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[HDU4652] Dice相关的知识,希望对你有一定的参考价值。

扔一个有m个面的骰子,每个面有一个数字,这些数字互不相同,求连续扔到n个数相同的期望步数或连续扔到n个数不同的期望步数

相同的:

  E[i]表示已经有i连续个相同,到达目标的期望步数

  E[i]=E[i+1]/m+(1-1/m)E[1].................... 1

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

  1-2得 E[i]-E[i+1]=(E[i+1]+E[i+2])/m

  设s[i]=E[i]-E[i+1],

  则s[0]=E[0]-E[1]=1,s[i+1]=m*s[i],ans=sigma(s[i])(0<=i<n)  

不同的:

  E[i]表示已经有i连续个不同,到达目标的期望步数

  E[i]=simga(E[j])/m+((m-i)/m)E[i+1],(1<=j<=i).................. 1

  E[i+1]=sigma(E[j])/m+((m-i-1)/m)E[i+2],(1<=j<=i+1)....... 2

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

  设s[i]=E[i]-E[i+1],

  则s[0]=E[0]-E[1]=1,s[i+1]=m/(m-i-1)s[i],ans=sigma(s[i])(0<=i<n)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define maxn 1000005
 4 int T,op,n;
 5 double m,s[maxn];
 6 void solve0(){
 7     s[0]=1;
 8     double ans=s[0];
 9     for(int i=0;i<n-1;i++)
10         s[i+1]=s[i]*m,ans+=s[i+1];
11     printf("%.9lf\\n",ans);
12 }
13 void solve1(){
14     s[0]=1;
15     double ans=s[0];
16     for(int i=0;i<n-1;i++)
17         s[i+1]=m/(m-i-1)*s[i],ans+=s[i+1];
18     printf("%.9lf\\n",ans);
19 }
20 int main(){
21     scanf("%d",&T);
22     while(T--){
23         scanf("%d%lf%d",&op,&m,&n);
24         if(op==0)solve0();
25         else solve1();
26     }
27     return 0;
28 }
View Code

 

  

以上是关于[HDU4652] Dice的主要内容,如果未能解决你的问题,请参考以下文章

HDU 4652 Dice:期望dp(成环)错位相减

[HDU4652]Dice

HDOJ4652 Dice

hdu 4586 Play the Dice (概率+等比数列)

[hdu 4586] Play the Dice

hdu 4586 Play the Dice