hdu 5001 概率dp

来源:互联网 发布:什么是php框架 编辑:程序博客网 时间:2024/04/27 22:10

给你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;}

0 0