poj 1322

题意是,c种不同颜色的巧克力,每种巧克力同样多,把巧克力一个一个拿到桌子上,当发现有相同颜色就全吃掉,求取出了n个后,还剩m个在桌子的概率。

直接求概率是不可能,要用到DP。

动态转移方程:

p[n][m]表示n个巧克力,还剩m个在台上的概率

p[n][m]=p[n-1][m-1]*p1+p[n-1][m+1]*p2

p1=(c-m+1)/c,p2=(m+1)/c

当m+n为奇时,概率为0

特别注意:当n很大时,概率处于稳定,但是还是要处理奇偶性

代码:

#include<iostream>
#include<fstream>

using namespace std;

double dp[1010][110];

int n,m,c;

void read(){
//	ifstream cin("in.txt");
	int i,j,k;
	while(cin>>c>>n>>m)
	{
		if(c==0) return;
		
		if(m>c||m>n||(m+n)%2)
		{
			printf("%.3lf\n",0);
			continue;
		}
		memset(dp,0,sizeof(dp));
		
		if(n>1000) n=1000+n%2;
		dp[0][0]=1;
		dp[1][1]=1;
		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]);

	}
}

int main(){
	read();
	return 0;
}

posted on 2011-05-12 16:44  宇宙吾心  阅读(599)  评论(0)    收藏  举报

导航