hdu5001 Walk

第一次做概率dp的题目 ,其处理的方式和普通dp是差不多的,只是将表示的值变成了概率 ,还有就是概率要怎么算是个难题 。

该题求从某个点 i 出发,走d步,不经过i的概率,我们可以求经过 i 的概率,用d[i][j]表示已经走了i步,当前在j点的概率(因为步数是一个天然的序,我们可以用来定义阶段)。

那么显然,如果没有经过j点,概率为0 ,所以初始化为0 ; 每次经过一个点j,那么经过j点的概率就要发生一次变化,假设从k点经过的j点,那么d[i][j]的概率就要加上1/(于k点相连的结点数) ;

所以说,其实和普通的dp一样,还是注意那几个点:阶段、顺序、依赖、d[i[[j]表示的是什么意思、状态如何转移 etc

细节参见代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 55;
int T,n,u,v,m,d;
double dp[10005][55];
vector<int> g[maxn];
void init() {
        scanf("%d%d%d",&n,&m,&d);
        for(int i=0;i<=n;i++) g[i].clear();
        for(int i=0;i<m;i++) {
            scanf("%d%d",&u,&v);
            g[u].push_back(v);
            g[v].push_back(u);
        }
}
double solve(int u) {
    memset(dp,0,sizeof(dp));
    dp[0][0] = 1;//初始化边界
    double ans = 0;
    for(int i=0;i<=d;i++) {
        for(int j=0;j<=n;j++) {
            if(j == u) continue;
            double p = 1.0/g[j].size();
            for(int k=0;k<g[j].size();k++) {
                int v = g[j][k];
                dp[i+1][v] += (dp[i][j] * p); //在第i+1步经过v点的概率。
            }
        }
        ans += dp[i+1][u]; //各步经过u点的概率
    }
    return 1.0 - ans;
}
int main() {
    scanf("%d",&T);
    while(T--) {
        init();
        for(int i=1;i<=n;i++) g[0].push_back(i);//初始化边界
        for(int i=1;i<=n;i++) {
            printf("%.10lf\n",solve(i));
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 12:47:20

hdu5001 Walk的相关文章

2014鞍山ACM网络赛 HDU5001 Walk

Walk Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 543    Accepted Submission(s): 344Special Judge Problem Description I used to think I could be anything, but now I know that I couldn't do

HDU5001 Walk(概率DP)

A - Walk Time Limit:15000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 5001 Description I used to think I could be anything, but now I know that I couldn't do anything. So I started traveling. The nation loo

HDU-5001 Walk 2014年鞍山网络赛E题

依次枚举每个不能走过的点,DP递推下一步情况,求出所有其他点的概率之和即为这个点不会被走过的概率. #include <iostream> #include <cstdio> #include <queue> #include <algorithm> #include <cstring> #include <cmath> #include <queue> #include <iomanip> #include

HDU5001 Walk (2014年鞍山赛区网络赛E题)

1.题目描述:点击打开链接 2.解题思路:本题利用矩阵快速幂+概率dp解决.根据题意可以画出来一个状态转移图,根据状态转移图不难得到一步转移概率矩阵,接下来的问题是:如何求解d步之内(包括d)均无法从其他点走到结点u的概率. 首先,既然无法到达结点u,那么出发的时候就不能选择该点.其次,为了使其他结点也无法到达结点u,可以将一步转移概率矩阵中跟结点u有关的概率全部置零.即表示u结点出发无法到达其他结点,其他结点也均无法到达u结点,这样就相当于把u结点从状态转移图中暂时删去了.然后根据马氏链的知识

HDU-5001 Walk (概率DP)

Problem Description I used to think I could be anything, but now I know that I couldn't do anything. So I started traveling. The nation looks like a connected bidirectional graph, and I am randomly walking on it. It means when I am at node i, I will

hdu5001---Walk

Walk Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 651    Accepted Submission(s): 402 Special Judge Problem Description I used to think I could be anything, but now I know that I couldn't d

hashlib、walk、yield

一.hashlib 生成MD5值 [[email protected] systeminformation]# vim hashlib2.py  #!/usr/bin/env python import hashlib import sys def md5sum(f):     m = hashlib.md5()     with open(f) as fd:         while True:             data = fd.read(4096)             if 

LYDSY模拟赛day1 Walk

/* 依旧考虑新增 2^20 个点. i 只需要向 i 去掉某一位的 1 的点连边. 这样一来图的边数就被压缩到了 20 · 2^20 + 2n + m,然后 BFS 求出 1 到每个点的最短路即可. 时间复杂度 O(20 · 2^20 + n + m) */ #include<cstdio> const int N=1300000,M=700010; int n,m,i,x,y,cnt,g0[N],g1[N],v[M],nxt[M],ed,h,t,q[N],d[N]; void add(in

[py]os.walk爬目录&sys.argv灵活获取参数

1, 遍历目录 os.walk('/tmp') os.next() ? 2,sys.argv ######################################## [email protected]:~/t$ cat t8.py import sys name=sys.argv[1] #获取参数 age=sys.argv[2] ? info=''' name:%s age :%s ''' %(name,age) ? print info print "#"*40 print