【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 }
View Code

 

posted @ 2015-02-26 09:13  Tunix  阅读(247)  评论(0编辑  收藏  举报