【ZOJ】【3329】One Person Game
概率DP/数学期望
kuangbin总结题目中的第三道
看来还是没有进入状态啊……都说是DP了……当然是要找【状态之间的转移关系】了……
本题中dp[i]跟 dp[i-(k1+k2+k3)] 到dp[i-1]都有关系……然后所有的dp[i]都跟dp[0]即ans有关……
用【系数】进行转移……sigh最近越来越水了
1 //BZOJ 1000 2 #include<cmath> 3 #include<vector> 4 #include<cstdio> 5 #include<cstring> 6 #include<cstdlib> 7 #include<iostream> 8 #include<algorithm> 9 #define rep(i,n) for(int i=0;i<n;++i) 10 #define F(i,j,n) for(int i=j;i<=n;++i) 11 #define D(i,j,n) for(int i=j;i>=n;--i) 12 #define pb push_back 13 using namespace std; 14 int getint(){ 15 int v=0,sign=1; char ch=getchar(); 16 while(!isdigit(ch)) {if(ch=='-') sign=-1; ch=getchar();} 17 while(isdigit(ch)) {v=v*10+ch-'0'; ch=getchar();} 18 return v*sign; 19 } 20 const int N=1e7+10,INF=~0u>>2; 21 /*******************template********************/ 22 23 double A[505],B[505],p[20]; 24 25 int main(){ 26 // freopen("input.txt","r",stdin); 27 int T=getint(); 28 int k1,k2,k3,a,b,c,n; 29 while(T--){ 30 n=getint(); k1=getint(); k2=getint(); k3=getint(); 31 a=getint(); b=getint(); c=getint(); 32 double p0=1.0/k1/k2/k3; 33 memset(p,0,sizeof p); 34 F(i,1,k1) F(j,1,k2) F(k,1,k3) 35 if (i!=a || j!=b || k!=c) p[i+j+k]+=p0; 36 37 D(i,n,0){ 38 A[i]=p0; B[i]=1; 39 F(j,1,k1+k2+k3){ 40 if (i+j>n) break; 41 A[i]+=A[i+j]*p[j]; 42 B[i]+=B[i+j]*p[j]; 43 } 44 } 45 printf("%.15lf\n",B[0]/(1-A[0])); 46 } 47 return 0; 48 }