概率dp
方程:dp[i][j]=dp[i-1][j-1]*(c-j+1)*1.0/c+dp[i-1][j+1]*(j+1)*1.0/c;
由于N比较大,数组会爆,要开成滚动。。
#include <iostream>
using namespace std;
int c,n,m;
double dp[1050][100];
int main()
{
int i,j,k;
while(scanf("%d%d%d",&c,&n,&m)!=EOF)
{
if(!c)
break;
if(m>c || m>n || (m+n)%2)
{
puts("0.000");
continue;
}
memset(dp,0,sizeof(dp));
//dp[i][j]=dp[i-1][j-1]*(c-j+1)*1.0/c+dp[i-1][j+1]*(j+1)*1.0/c;
dp[0][0]=1;
dp[1][1]=1;
if(n>1000)
n=1000+n%2;
for(i=2;i<=n;i++)
for(j=0;j<=c;j++)
{
if(j>0)
dp[i][j]=dp[i-1][j-1]*(c-j+1)/c;
if(j<c)
dp[i][j]+=dp[i-1][j+1]*(j+1)/c;
}
printf("%.3lf\n",dp[n][m]);
}
return 0;
}