BZOJ3029 守衛者的挑戰 期望DP

2022-05-20 07:13:35 字數 1463 閱讀 7769

time limit: 2 sec  memory limit: 128 mb

[submit][status][discuss]

的地圖殘片。地圖殘片必須裝在包包裡才能帶出擂台,包包沒有必要全部裝滿,但是隊員們必須把

【獲得的所有的】地圖殘片都帶走(沒有得到的不用考慮,只需要完成所有n項挑戰後揹包容量足夠容納地圖殘片即可),才能拼出完整的地圖。並且他們至少要挑戰成功l次才能離開擂台。

隊員們一籌莫展之時,善良的守衛者nizem幫忙預估出了每項挑戰成功的概率,其中第i項挑戰成功的概率為pi%。現在,請你幫忙**一下,隊員們能夠帶上他們獲得的地圖殘片離開擂台的概率。

第一行三個整數n,l,k。

第二行n個實數,第i個實數pi表示第i項挑戰成功的百分比。

第三行n個整數,第i個整數ai表示第i項挑戰的屬性值.

乙個整數,表示所求概率,四捨五入保留6 位小數。

5 1 2

36 44 13 83 63

-1 2 -1 2 1

0.980387

0<=k<=2000,0<=n<=200,-1<=ai<=1000,0<=l<=n,0<=pi<=100。

挑戰成功第 i 次會獲得乙個 ai 的貢獻,挑戰成功的概率是 pi,初始已經有k的貢獻,問至少挑戰成功 l 次且貢獻》=0 的概率。

簡單的期望dp,由於n只有200,顯然我們直接令 f[i][j][k] 表示 前 i 個挑戰,勝利了 j 次,當前貢獻為 k 的概率即可,然後轉移一下。

由於貢獻最小只可能是-1,所以 k>=n 的時候剩下的貢獻必然都》=0,所以我們上限調整為n即可,中間可能有負數,+200來實現儲存。

1  #include2 #include  

3 #include4 #include5 #include6 #include7 #include8

using

namespace

std; 910

const

int one = 205;11

12int

n,limit,k;

13int

a[one];

14float

p[one],ans;

15float f[one][one][one*2]; //

i times j win k bag

1617

intget

() 18

2728

int id(int x)

2930

intmain()

3144

45for(int j=limit; j<=n; j++)

46for(int k=id(0); k<=id(n); k++)

47 ans +=f[n][j][k];

4849 printf("

%.6f

", ans);50}

51

view code

BZOJ3029 守衛者的挑戰

第一行三個整數n,l,k。第二行n個實數,第i個實數pi表示第i項挑戰成功的百分比。第三行n個整數,第i個整數ai表示第i項挑戰的屬性值.乙個整數,表示所求概率,四捨五入保留6 位小數。樣例輸入1 3 1 0 10 20 30 1 1 2 樣例輸入2 5 1 2 36 44 13 83 63 1 2...

bzoj3029 守衛者的挑戰

題目 題目描述 監獄的所在地。突然,眼前一道亮光閃過。我,nizem,是黑魔法聖殿的守衛者。如果你 能通過我的挑戰,那麼你可以帶走黑魔法聖殿的地圖 瞬間,隊員們被傳送到了乙個擂 台上,最初身邊有乙個容量為 k 的包包。擂台賽一共有 n 項挑戰,各項挑戰依次進行。第i 項挑戰有乙個屬性 ai 如果ai...

bzoj 3029 守衛者的挑戰 概率dp

有n個位置,每個位置有乙個權值ai,若ai 0則ai必為 1,且有pi的概率獲得這個值。初始值為k。現在問至少獲得了l個值且獲得的值的和不小於0的概率。n 200,l n,ai,k 2000 設f i,j,k 表示到第i個位置,拿了j個值,當前和為k的概率。顯然若當前的值大於n的話就一定可以滿足和不...