hdu 4089 Activation 概率dp 消元

来源:互联网 发布:主流的校园网网络拓扑 编辑:程序博客网 时间:2024/04/29 18:38

虽然是求概率,但是和倒着求期望有些类似,使用的是全概率公式dp[i][j]表示的是从这一点到达目标点的概率

图中有环,只能消元,成环有一定的规律,先求dp[i][i]

参考 http://www.cnblogs.com/kuangbin/archive/2012/10/03/2710987.html

#include<iostream>#include<algorithm>#include<iostream>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<vector>#include<queue>#include<cmath>using namespace std;#define ll long long#define inf 0x3f3f3f3fint dir[4][2]={0,1,0,-1,1,0,-1,0};const double eps=1e-8;double c[2005];double pp[2005];double dp[2005][2005];int n,m,k;double p1,p2,p3,p4,p,p31,p41;int main(){while(scanf("%d%d%d%lf%lf%lf%lf",&n,&m,&k,&p1,&p2,&p3,&p4)!=EOF){if(p4<eps)        {            printf("0.00000\n");            continue;        }memset(dp,0,sizeof(dp));        memset(c,0,sizeof(c));int i,j;p=p2/(1.0-p1);p31=p3/(1.0-p1);p41=p4/(1.0-p1);pp[0]=1.0;for(int i=1;i<=n;i++) pp[i]=p*pp[i-1];        dp[1][1]=p41/(1-p);        c[1]=p41;        for(int i=2;i<=n;i++)        {            for(int j=2;j<=k&&j<=i;j++)c[j]=p31*dp[i-1][j-1]+p41;            for(int j=k+1;j<=i;j++) c[j]=p31*dp[i-1][j-1];            double tmp=c[1]*pp[i-1];            for(int j=2;j<=i;j++)tmp+=c[j]*pp[i-j];            dp[i][i]=tmp/(1-pp[i]);            dp[i][1]=p*dp[i][i]+c[1];            for(int j=2;j<i;j++)dp[i][j]=p*dp[i][j-1]+c[j];        }        printf("%.5lf\n",dp[n][m]);}return 0;}


0 0
原创粉丝点击