UVA 11021 繁衍麻球
题意:
一只麻球只能活一天,然后每天会生一次;
给出n,k,m;
n代表有一只麻球一次最多生n-1只;
接下来n行分别是生0到n-1只的概率p[i];
k代表一开始有k只麻球;问m天后麻球死光的概率
讲过的题
单独考虑每个麻球
dp[i]为一个麻球在i天内死亡的概率
那么有转移方程dp[i]=p[0]*dp[i-1]^0+p[1]*dp[i-1]^1+.....+p[n-1]*dp[i-1]^(n-1)
O(nm)转移即可
//%std #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<stack> #include<set> #include<map> using namespace std; #define lovelive long long #define lc son[x][0] #define rc son[x][1] #define lowbit(x) (x&(-x)) #define pt vc void read(int &x) { int p=1; x=0; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') p=-1; c=getchar(); } while(c>='0'&&c<='9') { x=x*10+c-48; c=getchar(); } x*=p; } double dp[1010],p[1010]; int main() { int T,n,k,m; double ans,tmp; read(T); for(int t=1;t<=T;t++) { read(n);read(k);read(m); for(int i=0;i<n;i++) scanf("%lf",&p[i]); for(int i=1;i<=m;i++) { tmp=1; dp[i]=0; for(int j=0;j<n;j++) { dp[i]+=p[j]*tmp; tmp*=dp[i-1]; } } ans=1; for(int i=1;i<=k;i++) ans*=dp[m]; printf("Case #%d: %.7lf\n",t,ans); } return 0; } /* 4 3 1 1 0.33 0.34 0.33 3 1 2 0.33 0.34 0.33 3 1 2 0.5 0.0 0.5 4 2 2 0.5 0.0 0.0 0.5 */