码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5001 概率dp

时间:2015-03-30 21:14:21      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:dp

给你n个点  每条边   最初你在n个点是等概率的    问在k步后  每个点不经过的概率     之前dp直接算到达的概率然后用1去减   结果测试数据都没过,想了想也是   里面有算重复的,

dp【i】【j】 表示第i步到达j点的概率  然后枚举起点    dp都要清空并初始化(这就是为什么直接不能做了)     对于每个起点   不能到达它也就是到达了别的点     这样就好算了


#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

double dp[10010][55];
int leap[55],map[55][55],n,k;
int deal(int star)
{
    int i,j;
    for(i=1;i<=k;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(j==star) continue;
            for(int x=1;x<=n;x++)
            {
                if(x==j) continue;
                if(map[j][x]==1)
                {
                    dp[i][x]+=dp[i-1][j]/leap[j];
                }
            }
        }
    }
    double t=0;
    for(i=1;i<=n;i++)
    if(i!=star)    t+=dp[k][i];
    printf("%.10lf\n",t);
}
int main()
{
    int m,i,j,star,end,T;
    scanf("%d",&T);
    while(T--)
    {    
        scanf("%d%d%d",&n,&m,&k);
        memset(map,-1,sizeof(map));
        memset(leap,0,sizeof(leap));
        for(i=1;i<=m;i++)
        {
            int star,end;
            scanf("%d%d",&star,&end);
            map[star][end]=map[end][star]=1;
            leap[star]++;
            leap[end]++;
        }
        for(i=1;i<=n;i++)
        {
            memset(dp,0,sizeof(dp));
            for(j=1;j<=n;j++)
            dp[0][j]=1.0/n;
            deal(i);
        }
    }
    return 0;
}

hdu 5001 概率dp

标签:dp

原文地址:http://blog.csdn.net/zxf654073270/article/details/44756125

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!