HDU4652Dice(概率DP)

题目链接:传送门 


题意:

给定一个m个面的骰子然后给定两种询问,0 m n,表示求丢多少次使得最后丢的n次都相同的期望,1 m n表示求最后丢的n次两两不相同的期望。


分析:

设dp[i]表示已经有i个相同/不相同的到n个不相同的期望那么dp[n]很明显等于0。

连续n个相同:

dp[0] = 1 + dp[1],0的后继状态只可能出现1且概率为1.

dp[1] = 1 + dp[2]*(1/m) + dp[1]*(m-1)/m,1的后继状态只会有1,2两种情况概率分别为(m-1)/m,1/m;

...

dp[i] = 1 + dp[i+1]*(1/m) + dp[1]*(m-1)/m,i的后继状态也只有1,i+1两种情况概率分别为(m-1)/m,1/m;

dp[i+1] = 1 + dp[i+2]*(1/m) + dp[1]*(m-1)/m,i的后继状态也只有1,i+2两种情况概率分别为(m-1)/m,1/m;

...

dp[n] = 0;

设d[i] = dp[i] -dp[i+1] ,d[0]=1;

d[i] = 1/m * d[i+1]

d[0]+d[1]+...+d[n-1] =  dp[0] - dp[n] = m^0 + m^1 +...+ m^(n-1) 

连续n个不相同:

dp[0] = 1 + dp[1] 0的后继状态只有1这一种概率为1.

dp[1] = 1 + dp[1]*(1/m) + dp[2]*(m-1)/m; 1的后继状态有1,2,这两种情况概率为1/m,(m-1)/m;

dp[2] = 1 + (dp[1]+dp[2])*(1/m) + dp[3]*(m-2)/m;1的后继状态有1,2,3这三种情况概率为1/m,1/m,(m-2)/m;

...

dp[i] = 1 + (dp[1] + dp[2]+...+ dp[i])*(1/m) + dp[i+1]*(m-i)/m;1的后继状态有1,2,3,..i,i+1这i+1种情况概率为1/m,..,1/m,(m-i)/m;

dp[i+1] = 1 + (dp[1] + dp[2]+...+ dp[i]+dp[i+1])*(1/m) + dp[i+2]*(m-i-1)/m;1的后继状态有1,2,3,..i,i+1这i+1种情况概率为1/m,..,1/m,(m-i-1)/m;

...

dp[n]=0;

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

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


代码如下:

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

double calc1(int m,int n){
    double ans = 0;
    for(int i=0;i<n;i++){
        ans = ans+pow(m+0.0,i);
    }
    return ans;
}

double calc2(int m,int n){
    double ans = 0;
    double tmp = 1.0;
    for(int i=1;i<=n;i++){
        ans+=tmp;
        tmp=tmp*m/(m-i);
    }
    return ans;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int ord,n,m;
        scanf("%d%d%d",&ord,&m,&n);
        if(ord==0){
            printf("%.7lf\n",calc1(m,n));
        }
        else{
            printf("%.7lf\n",calc2(m,n));
        }
    }
    return 0;
}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值