ZOJ 3329 One Person Game——期望DP
Posted narh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZOJ 3329 One Person Game——期望DP相关的知识,希望对你有一定的参考价值。
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754
高斯消元好像时间复杂度太高。
注意到每个位置都可以从 dp[ 0 ] 转移过来,所以可以想到每个 dp[ i ] 都可以表示成 a[ i ]*dp[ 0 ] + b[ i ] 的形式;这样如果算出了 a[ 0 ] 和 b[ 0 ] ,就能直接算出 dp[ 0 ] 了。
( dp[i]=a[i]*dp[0]+b[i] )
( dp[i]=sumlimits_{j=1}^{k}dp[i+j]*p[j] + dp[0]*p[0] + 1 )
( dp[i]=sumlimits_{j=1}^{k}(a[i+j]*p[j]*dp[0]+b[i+j]*p[j]) + dp[0]*p[0] + 1 )
( dp[i]=((sumlimits_{j=1}^{k}a[i+j]*p[j])+p[0])dp[0]+(sumlimits_{j=1}^{k}b[i][j]*p[j])+1 )
所以 ( a[i]=(sumlimits_{j=1}^{k}a[i+j]*p[j])+p[0] ) , ( b[i]=(sumlimits_{j=1}^{k}b[i][j]*p[j])+1 )
注意多组数据的清零。空间不是 505 而是 525 。
#include<cstdio> #include<cstring> #include<algorithm> #define db double using namespace std; int rdn() { int ret=0;bool fx=1;char ch=getchar(); while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)fx=0;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘)ret=ret*10+ch-‘0‘,ch=getchar(); return fx?ret:-ret; } const int N=525,M=20; int n,c[5],t[5]; db p[M],a[N],b[N]; int main() { int T=rdn(); while(T--) { n=rdn();for(int i=1;i<=3;i++)c[i]=rdn(); for(int i=1;i<=3;i++)t[i]=rdn(); db tp=1.0/(c[1]*c[2]*c[3]); p[0]=tp; int lm=c[1]+c[2]+c[3]; for(int i=1;i<=lm;i++)p[i]=0;// for(int i=1;i<=c[1];i++) for(int j=1;j<=c[2];j++) for(int k=1;k<=c[3];k++) { if(i==t[1]&&j==t[2]&&k==t[3])continue; p[i+j+k]+=tp; } for(int i=0;i<=n;i++)a[i]=p[0],b[i]=1; for(int i=n+1,j=n+lm;i<=j;i++)a[i]=b[i]=0;//// for(int i=n;i>=0;i--) for(int j=1;j<=lm;j++) a[i]+=a[i+j]*p[j],b[i]+=b[i+j]*p[j]; printf("%.10f ",b[0]/(1-a[0])); } return 0; }
以上是关于ZOJ 3329 One Person Game——期望DP的主要内容,如果未能解决你的问题,请参考以下文章
ZOJ 3329:One Person Game 概率DP求期望(有环)