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 
#include 
#include 
using namespace std;

double calc1(int m,int n){
    double ans = 0;
    for(int i=0;i




你可能感兴趣的:(DP)