題目描述:
有N個點,每兩個點都有P的概率建邊,問最後N個點聯通概率
題目分析:
概率DP。
首先 如果只有一個點 Ans=1
兩個點 Ans=p
我們設 F(n) 爲 n個點聯通的概率 G(n) 爲n個點不聯通的概率
顯然 F(n)=1.0-G(n)
目前有i個點,枚舉j個點爲聯通的,那麼第i個和j-1個點聯通概率即爲跟剩下的 i-j點不連通的概率即爲
所以
遞推得出答案。
題目鏈接:
AC代碼:
#include <cstdio>
#include <cmath>
#define ll long long
using namespace std;
double ans[30],q;
ll p[21];
int n;
inline ll C(int n,int m){return (p[n]/p[m])/p[n-m];}
int main()
{
p[0]=1;
for(int i=1;i<=20;i++) p[i]=p[i-1]*1ll*i;
scanf("%d%lf",&n,&q);
ans[1]=1.0,ans[2]=q;
for(int i=3;i<=n;i++)
{
ans[i]=1.0;
for(int j=1;j<i;j++)
ans[i]-=C(i-1,j-1)*ans[j]*pow(1.0-q,j*(i-j));
}
printf("%.7lf\n",ans[n]);
return 0;
}