概率dp,建图,dp[i][j]当前在第i个点,还剩j步,到目标状态的概率是多少。最后用贝叶斯公式算出答案。
#include <bits/stdc++.h>
#define maxn 55
#define maxm 1000009
using namespace std;
int n,m;
double dp[55][55];
bool mark[maxn];
struct Edge
{
int v,next;
}edge[maxm];
int head[maxn],tot,out[maxn];
bool vis[maxn][maxn];
inline void addedge(int u,int v)
{
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
double solve(int u,int k)
{
if(vis[u][k])
return dp[u][k];
vis[u][k]=1;
if(k==0)
{
if(mark[u])
return dp[u][k]=1.0;
else
return dp[u][k]=0.0;
}
dp[u][k]=0;
for(int e=head[u];e!=-1;e=edge[e].next)
{
dp[u][k]+=solve(edge[e].v,k-1)*1.0/out[u];
}
return dp[u][k];
}
class ParkAmusement
{
public: double getProbability(vector <string> a, int s, int K)
{
n=a.size();
memset(head,-1,sizeof(head));tot=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]=='1')
addedge(i,j),out[i]++;
}
if(a[i][i]=='E')
mark[i]=1;
}
double fz=0,fm=0;
for(int i=0;i<n;i++)
{
fm+=solve(i,K);
if(i==s)
fz=solve(i,K);
}
return fz/fm;
}
};