守衛者的挑戰 三維dp

2022-08-15 08:27:17 字數 1302 閱讀 3216

守衛者的挑戰

難度級別: c; 程式語言:不限;執行時間限制:1000ms; 執行空間限制:262144kb; **長度限制:2000000b

試題描述

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

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

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

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

輸入示例

3 1 0

10 20 30

-1 -1 2

輸出示例

0.300000

其他說明

資料範圍:0<=k<=2000,0<=n<=200,-1<=ai<=1000,0<=l<=n,0<=pi<=100.

題目如上。

這道題是學了hzwer才想出來的。一開始在想負數下標的問題還有概率怎麼算,看了之後發現這不是事兒。

先排序一下挑戰,然後dp概率,我們用f[i][j][k]代表參加了i場挑戰贏了j場時有k個空間的概率

,最後累加一下就出來了

資料不小,直接按題目所說定義三維陣列空間不夠,看到n<=200後發現所有大於200的資料可以忽視……

不多說貼**:

1 #include2

using

namespace

std;

3double f[205][205][205

],ans;

4struct hha[205];5

bool

operator

6int

read()710

while(ch>='

0'&&ch<='9')

11return x*f;12}

13int

main()

1418

for (i=1;i<=n;i++) a[i].v=read();

19 sort(a+1,a+n+1);f[0][0][min(k,200)]=1;20

for (i=0;ifor (k=0;k<=i;k++) for (j=0;j<=n;j++)

2126

for (i=0;i<=n;i++) for (j=l;j<=n;j++) ans+=f[n][j][i];

27 printf("

%.6lf

",ans);

28//

system("pause");

29return0;

30 }

view code

期望DP 守衛者的挑戰

擂台賽一共有n項挑戰,各項挑戰依次進行。第i項挑戰有乙個屬性ai,如果ai 0,表示這次挑戰成功後可以再獲得乙個容量為ai的包包 如果ai 1,則表示這次挑戰成功後可以得到乙個大小為1 的地圖殘片。地圖殘片必須裝在包包裡才能帶出擂台,包包沒有必要全部裝滿,但是隊員們必須把 獲得的所有的地圖殘片都帶走...

守衛者的挑戰

題目描述 隊員們被傳送到了乙個擂台上,最初身邊有乙個容量為k的包包。擂台賽一共有項挑戰,各項挑戰依次進行。第項挑戰有乙個屬性ai,如果ai 0,表示這次挑戰成功後可以再獲得乙個容量為ai的包包 如果ai 1,則表示這次挑戰成功後可以得到乙個大小為1的地圖殘片。地圖殘片必須裝在包包裡才能帶出擂台,包包...

守衛者的挑戰

初始值為 k 現經過一段數,有 p i 的概率加上第 i 個數 a i 問最後值 geq0 且加了 l 個數的概率。注意到 k 200 都是沒有意義的,於是可以把 k 的範圍視為 0 leq k leq200 直接設 f i j k 表示處理了第 1 i 個數,加了 j 個數,值為 k 的概率。決策...