您的位置:首页 > 大数据 > 人工智能

Lightoj 1038 - Race to 1 Again (概率DP)

2015-11-10 18:19 507 查看
题目链接:

  Lightoj 1038 - Race to 1 Again

题目描述:

  给出一个数D,每次可以选择数D的一个因子,用数D除上这个因子得到一个新的数D,为数D变为1的操作次数的期望为多少?

解题思路:

  概率DP咯,对于只知道期望是:E(X) = X1*p(X1) + X2*p(X2) + …… + Xn*p(Xn)的窝,拿这个题目没有一点办法。然后看了讨论版,发现总会有一些神人存在。

  求操作次数的期望时,先设定第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,然后先后依次递推就好啦。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;
typedef long long LL;
const int maxn = 100010;
const int INF = 0x3f3f3f3f;

double dp[maxn];
int main ()
{
int T;
scanf ("%d", &T);
memset (dp, 0, sizeof(dp));
for (int i=2; i<maxn; i++)
{
double num, ans;
num = -1;
ans = 0;
int nu = (int)sqrt (i);
for (int j=1; j<=nu; j++)
{
if (i%j == 0)
{
num ++;
ans += 1 + dp[j];
if (j != i/j)
{
num ++;
ans += 1 + dp[i/j];
}
}
dp[i] = ans / num;
}
}
for (int t=1; t<=T; t++)
{
int n;
scanf ("%d", &n);
printf ("Case %d: %lf\n", t, dp
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: