poj 1322 Chocolate 概率dp

来源:互联网 发布:js弹出确认对话框 编辑:程序博客网 时间:2024/05/17 09:47

//poj 1322 AC//sep9#include <iostream>using namespace std;int c,n,m;double dp[2][128];int main(){while(scanf("%d",&c)==1&&c){scanf("%d%d",&n,&m);if(m>c||m>n||(m+n)%2){puts("0.000");continue;}if(n>1000){n=1000+n%2;}memset(dp,0,sizeof(dp));dp[0][0]=1.0;for(int i=1;i<=n;++i)for(int j=0;j<=i&&j<=c;++j){dp[i%2][j]=0.0;if((i+j)%2) continue;if(j>0) dp[i%2][j]+=dp[1-i%2][j-1]*((c-j+1.0)*1.0/c); if(j+1<=i&&j+1<=c) dp[i%2][j]+=dp[1-i%2][j+1]*((j+1.0)*1.0/c);}printf("%.3lf\n",dp[n%2][m]);}return 0;} 

//poj 1322 矩阵乘法解法 tle//sep9#include <iostream>using namespace std;int c,n,m;const int MAXC=128;double pow[12][MAXC][MAXC];double tmp[MAXC][MAXC],ans[MAXC][MAXC];void copy(double t[][MAXC],double s[][MAXC]){for(int i=0;i<=c;++i)for(int j=0;j<=c;++j)t[i][j]=s[i][j];}void mul_mat(double C[][MAXC],double A[][MAXC],double B[][MAXC]){for(int i=0;i<=c;++i)for(int j=0;j<=c;++j)C[i][j]=0.0;for(int k=0;k<=c;++k)for(int i=0;i<=c;++i)for(int j=0;j<=c;++j)C[i][j]+=A[i][k]*B[k][j];return ;}void cal_pow(){for(int i=1;i<10;++i)mul_mat(pow[i],pow[i-1],pow[i-1]); }int main(){while(scanf("%d",&c)==1&&c){scanf("%d%d",&n,&m);if(m>c||m>n){puts("0.000");}if(n>1000){n=1000+n%2;}for(int i=0;i<=c;++i)for(int j=0;j<=c;++j)pow[0][i][j]=0.0;for(int i=1;i<=c;++i){pow[0][i-1][i]=1.0*i/c;pow[0][i][i-1]=(c+1-1.0*i)/c;}cal_pow();for(int i=0;i<=c;++i)for(int j=0;j<=c;++j)ans[i][j]=0.0;for(int i=0;i<=c;++i)ans[i][i]=1.0;for(int e=0;e<10;++e)if(n&(1<<e)){copy(tmp,ans);mul_mat(ans,tmp,pow[e]);}printf("%.3lf\n",ans[m][0]);}return 0;} 


0 0
原创粉丝点击