概率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 }