记忆化就可以搞定,比赛里都没做出来,真的是态度有问题啊。。。
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 double p[1001]; 7 double dp[1001]; 8 int flag[1001],n; 9 double po(double a,int k) 10 { 11 double b = 1.0; 12 while(k) 13 { 14 if(k&1) 15 b = a*b; 16 a = a*a; 17 k = k/2; 18 } 19 return b; 20 } 21 double dfs(int step) 22 { 23 int i; 24 if(flag[step]) 25 return dp[step]; 26 if(step == 1) 27 return p[0]; 28 double ans = p[0],temp; 29 for(i = 1;i < n;i ++) 30 { 31 temp = p[i]; 32 temp *= po(dfs(step-1),i); 33 ans += temp; 34 } 35 flag[step] = 1; 36 return dp[step] = ans; 37 } 38 int main() 39 { 40 int t,cas = 1,i,m,k; 41 double ans,temp; 42 scanf("%d",&t); 43 while(t--) 44 { 45 scanf("%d%d%d",&n,&k,&m); 46 memset(flag,0,sizeof(flag)); 47 for(i = 0;i < n;i ++) 48 scanf("%lf",&p[i]); 49 if(m == 0) 50 { 51 printf("Case #%d: %.7lf\n",cas++,0.0); 52 continue; 53 } 54 ans = 1; 55 temp = dfs(m); 56 for(i = 0;i < k;i ++) 57 ans *= temp; 58 printf("Case #%d: %.7lf\n",cas++,ans); 59 } 60 return 0; 61 }