成都區域賽區Maze杭電4035 dp求期望

2021-06-08 12:47:12 字數 2676 閱讀 2102

02.    dp求期望的題。

03.    題意:

04.    有n個房間,由n-1條隧道連通起來,實際上就形成了一棵樹,

05.    從結點1出發,開始走,在每個結點i都有3種可能:

06.        1.被殺死,回到結點1處(概率為ki)

07.        2.找到出口,走出迷宮 (概率為ei)

08.        3.和該點相連有m條邊,隨機走一條

09.    求:走出迷宮所要走的邊數的期望值。

10.     

11.    設 e[i]表示在結點i處,要走出迷宮所要走的邊數的期望。e[1]即為所求。

12.     

13.    葉子結點:

14.    e[i] = ki*e[1] + ei*0 + (1-ki-ei)*(e[father[i]] + 1);

15.         = ki*e[1] + (1-ki-ei)*e[father[i]] + (1-ki-ei);

16.     

17.    非葉子結點:(m為與結點相連的邊數)

18.    e[i] = ki*e[1] + ei*0 + (1-ki-ei)/m*( e[father[i]]+1 + ∑( e[child[i]]+1 ) );

19.         = ki*e[1] + (1-ki-ei)/m*e[father[i]] + (1-ki-ei)/m*∑(e[child[i]]) + (1-ki-ei);

20.     

21.    設對每個結點:e[i] = ai*e[1] + bi*e[father[i]] + ci;

22.     

23.    對於非葉子結點i,設j為i的孩子結點,則

24.    ∑(e[child[i]]) = ∑e[j]

25.                   = ∑(aj*e[1] + bj*e[father[j]] + cj)

26.                   = ∑(aj*e[1] + bj*e[i] + cj)

27.    帶入上面的式子得

28.    (1 - (1-ki-ei)/m*∑bj)*e[i] = (ki+(1-ki-ei)/m*∑aj)*e[1] + (1-ki-ei)/m*e[father[i]] + (1-ki-ei) + (1-ki-ei)/m*∑cj;

29.    由此可得

30.    ai =        (ki+(1-ki-ei)/m*∑aj)   / (1 - (1-ki-ei)/m*∑bj);

31.    bi =        (1-ki-ei)/m            / (1 - (1-ki-ei)/m*∑bj);

32.    ci = ( (1-ki-ei)+(1-ki-ei)/m*∑cj ) / (1 - (1-ki-ei)/m*∑bj);

33.     

34.    對於葉子結點

35.    ai = ki;

36.    bi = 1 - ki - ei;

37.    ci = 1 - ki - ei;

38.     

39.    從葉子結點開始,直到算出 a1,b1,c1;

40.     

41.    e[1] = a1*e[1] + b1*0 + c1;

42.    所以

43.    e[1] = c1 / (1 - a1);

44.    若 a1趨近於1則無解...

45.**/  

#include #include #include #include using namespace std;  

const int maxn = 10000 + 5;

double e[maxn], k[maxn];

double a[maxn], b[maxn], c[maxn];

vectorv[maxn];

bool search(int i, int fa)

a[i] = k[i];

b[i] = (1 - k[i] - e[i]) / v[i].size();

c[i] = 1 - k[i] - e[i];

double tmp = 0;

for (int j = 0; j < (int)v[i].size(); j++)

if ( fabs(tmp - 1) < 1e-10 ) return false;

a[i] /= 1 - tmp;

b[i] /= 1 - tmp;

c[i] /= 1 - tmp;

return true;

}

int main()

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

cout << "case " << ca << ": ";

if ( search(1, -1) && fabs(1 - a[1]) > 1e-10 )

cout << c[1]/(1 - a[1]) << endl;

else

cout << "impossible" << endl;

} return 0;

}

成都賽區網路賽 hdu 4292 food

題目 給出n個人喜歡的飲料種類以及食物種類,每個人只能取其中一種且數量為1,現在給出有f中食物以及d種飲料,以及他們各自的數量,問如何安 排食物以及飲料,使得最多的人得到乙個食物以及一瓶飲料 題目類似poj3281 dining 只是那題目每個種類都只有數量1 所以這道題目就只用才起點建邊和終點建邊...

acm成都賽區網路熱身賽 Sum

題目大意 給你乙個n和x n的範圍 n 1000001 n表示有n個數,在這n個數查詢是否有兩個數之和為x的,如果有就輸出 yes 沒有 no sample input 3 3 1 2 3 2 31 3sample output yesno 最後我編了一組測試資料 3 16 1 8 16 no用二分...

hdu 4288 Coder 成都賽區 線段樹

題意 給出乙個有序集合,3種操作。插入乙個數,刪除乙個數,都保證序列有序。以及求和 其中求和是將下標 5 3的所有數求和 題解 線段樹 離散化 離線處理 一開始也是想的 線段樹 但是 這個和以前的 做過的 乙個線段樹 不同的 是 如果 我們 刪除 乙個 元素後 那麼 他的 下標 將會 改變 比賽是 ...