概率dp light1038

题意:问一个数一步步除以他的除数,最后转移到1,所需要的期望步数。

思路,概率dp问题,从结果逆推,本题是从1开始往后推,怎么个推法呢。参考一下别人的博客;

求操作次数的期望时,先设定第i个因子给期望的贡献为Ti,那么有:E = (T1 + T2 + T3 + ...... + Tn)  / n;

根据期望的定理:从当前位置移动到目的地的平均步数。所以可得到:E50 = (E1+1)/6 + (E2+1)/6 + (E5+1)/6 + (E10+1)/6 + (E25+1)/6 + (E50+1)/6;

E1 == 0,然后先后依次递推就好啦。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<math.h>
 4 #include<string.h>
 5 using namespace std;
 6 const int maxn=1e5+10;
 7 double dp[maxn];
 8 int main()
 9 {
10     for(int i=2;i<=maxn;i++){
11         int limit=sqrt(i);
12         double num=-1,ans=0;
13         //num从-1开始的原因是,下文将1的情况考虑了在内,而除以1是等于本身;
14         for(int j=1;j<=limit;j++){
15             if(i%j==0){
16                 num++,ans+=1+dp[j];
17                 if(i!=j*j) num++,ans+=1+dp[i/j];
18             }
19         }
20         dp[i]=ans/num;
21     }
22     int T;
23     scanf("%d",&T);
24     for(int i=1;i<=T;i++){
25         int tmp;
26         scanf("%d",&tmp);
27         printf("Case %d: %f\n",i,dp[tmp]);
28     }
29     return 0;
30 }

 

posted @ 2019-09-28 11:09  古比  阅读(208)  评论(0编辑  收藏  举报