刚开始做这得时,dp方程很容易写出来。。。
dp(n+1,m+1)+=dp(n,m)*(c-m)/c
dp(n+1,m-1)+=dp(n,m)*m/c;
可根据这个思想写时,刚开始内存不够,改正之后一直超时(第一次另开个数组存结果,后来直接判断奇偶性,这都超时了)。。
实在没招,看了别人的,才知道这题用了个小技巧。。题目只要求保留三位有效数字,即对精度要求不是很高。根据统计学结果,当n足够大时,所求概率应趋于一个常数,即题目所求值。
#include<stdio.h>
#include<string.h>
double d[101][2];
int c,n,m;
int main()
{
while(~scanf("%d",&c)&&c)
{
scanf("%d%d",&n,&m);
if(m>c||m>n||(m+n)%2)
{
printf("0.000\n");
continue;
}
int i,k,j;
if(n > 1000)
n = n % 2 ? 1001 : 1000;
memset(d,0,sizeof(d[0])*(c+1));
d[0][0]=1.0;
for(i=1;i<=n;i++)
{
int x=i%2,y=(i+1)%2;
d[1][x]+=d[0][y];
d[0][y]=0;
for(j=1;j<=c-1;j++)
{
d[j-1][x]+=d[j][y]*j/c*1.0;
d[j+1][x]+=d[j][y]*(c-j)/c*1.0;
d[j][y]=0;
}
d[c-1][x]+=d[c][y];
d[c][y]=0;
}
printf("%.3f\n",d[m][(n)%2]);
}
return 0;
}