题目链接:http://www.topcoder.com/stat?c=problem_statement&pm=10335
题目大体意思:
在区间[lower,upper]中间取m个数,使得这m个数中第k小的数是n的概率
解法一:(强大的dp)参照别人解题报告写出来的
dp[m][s][b] 取m个数,比n小的最多s个,比n大的最多b个的概率(注意最多二字)
则dp[0][s][b]=1 这个初始化很重要
dp[m][s][b]=pe*dp[m-1][s][b] + ps*dp[m-1][s-1][b] + pb*dp[m-1][s][b-1] (当然要保证s-1和b-1都大于0的才转换过来)
totel = upper-lower+1;
pe就是和n相等的概率 pe=1/totel;
ps就是比n小的概率 ps=(n-lower)/totel;
pb就是比n大的概率 pb=(upper-n)/totel;
解法二:概率分析统计
第k个数是n,假设比n小的有a个,比n大的有b个,那么和n相等的就是M-a-b个
只要保证a<=k-1 b<=M-k 那么第k个数就是n
那么每次取定的a,b,对应的概率是:
C(M,a)*pa^a* C(M-a,b)*pb^b * pab^(M-a-b) pa,pb,pab和上面的ps,pb类似
最后对符合条件的a和b进行枚举,概率累加就可以