bzoj3270博物館 期望概率DP

2022-05-12 12:32:34 字數 1356 閱讀 5625

題目:

設計乙個狀態表示兩個人分別在兩個點的狀態,帶個標號num[i][j];

據此得到狀態之間轉移的關係所構成的n元方程,高斯消元求解;

要注意起點的概率要+1,而且開始時兩個人在兩個點是有區分的,所以不能(a,b)和(b,a)都加;

用scanf會ce,所以改成了快讀和cin;

調了一天的才找到錯誤竟然是把d陣列和deg陣列弄混了!

**如下:

#include#include

#include

#include

using

namespace

std;

int n,m,a,b,deg[25],ct,head[25

],cnt;

double d[630],a[630][630],p[25

];struct

n}edge[

625];

int num(int a,int b)

void

gauss()

}for(int i=cnt;i;i--)

}int

rd()

while(ch>='

0'&&ch<='

9')x=x*10+ch-'

0',ch=getchar();

return x*f;

}int

main()

for(int i=1;i<=n;i++)

//scanf("%lf",&p[i]);

cin>>p[i];

cnt=n*n;

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++) if(i!=j)

a[num(edge[k].to,j)][x]+=(1.0-p[i])*p[j]/deg[i];

}for(int l=head[j];l;l=edge[l].next)a[num(i,edge[l].to)][x]+=(1.0-p[j])*p[i]/deg[j];

a[x][x]+=p[i]*p[j];

}for(int i=1;i<=cnt;i++)a[i][i]-=1.0

; a[num(a,b)][cnt+1]-=1.0;//

printf("a[%d]=%.2lf\n",num(a,b),a[num(a,b)][cnt+1]);

//a[num(b,a)][cnt+1]-=1.0;

//兩人有區分!

gauss();

for(int i=1;i<=n;i++)

printf(

"%.6lf

",d[num(i,i)]);

return0;

}

bzoj3270 博物館 期望 高斯消元

傳送門本題的點數很少,只有20個 考慮用二元組 s u,v 表示甲在 u 點,乙在 v 點的狀態 那麼可以用 f s 表示狀態 s 出現的概率 不同的 f 之間的轉移就是通過邊 轉移有4種情況 對於 s u,v 來說,有以下四種轉移 轉移一,甲乙都選擇不動,此時從 s 轉移到 s 概率為 p u p...

BZOJ 3270 博物館 概率 高斯消元

source實力透露做法。似乎有這麼個式子 f i,j pi p j f i,j 1 pi di p j f x,j 1 pj dj p i f i,y 1 pi di1 pjdj f x,y x adj i,y adjj 然後還有f a,b 1答案為f i,i 開n n個變數的方程組高斯消元?時間...

bzoj 3270 博物館 高斯消元 期望轉移

乍一看比較難想到這是一道高斯消元的題目,因為概率不好轉移,得不到方程。但是反過來想,用f a,b 來表示,兩個人分別在a房間和b房間的期望。那麼這個期望是可以通過與其相連的房間的期望累加得到的 這裡的f p,q 是列舉的出發點,而p1是其對應的概率 所以可以看出乙個多元帶有係數的方程,這才引出了高斯...