期望DP 守衛者的挑戰

2021-08-21 10:44:43 字數 1696 閱讀 1813

擂台賽一共有n項挑戰,各項挑戰依次進行。第i項挑戰有乙個屬性ai,如果ai>=0,表示這次挑戰成功後可以再獲得乙個容量為ai的包包;如果ai=-1,則表示這次挑戰成功後可以得到乙個大小為1 的地圖殘片。地圖殘片必須裝在包包裡才能帶出擂台,包包沒有必要全部裝滿,但是隊員們必須把 獲得的所有的地圖殘片都帶走(沒有得到的不用考慮,只需要完成所有n項挑戰後揹包容量足夠容納地圖殘片即可),才能拼出完整的地圖。並且他們至少要挑戰成功l次才能離開擂台。

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

input

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

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

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

output

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

sample input

樣例輸入1

3 1 0

10 20 30

-1 -1 2

樣例輸入2

5 1 2

36 44 13 83 63

-1 2 -1 2 1

sample output

樣例輸出1

0.300000

樣例解釋:

若第三項挑戰成功,如果前兩場中某場勝利,隊員們就有空間來容納得到的地圖殘片,如果挑戰失敗,根本就沒有獲得地圖殘片,不用考慮是否能裝下;若第三項挑戰失敗,如果前兩場有勝利,沒有包來裝地圖殘片,如果前兩場都失敗,不滿足至少挑戰成功l次(l=1)的要求。因此所求概率就是第三場挑戰獲勝的概率。

樣例輸出2

0.980387

data constraint

對於 100% 的資料,保證0<=k<=2000,0<=n<=200,-1<=ai<=1000,0<=l<=n,0<=pi<=100。

容易看出是概率期望dp

然後剛開始想的方程是fi,j,k表示參與前i把贏了j把揹包剩k的

然後發現k賊大

後面想了想,最多n個地圖碎片,超過n的部分等於做無用功,所以取min值即可

然後想到判地圖碎片比容積大,排序一**積,有體積的在前面,沒體積的在後面就很容易判斷了,狀態轉移方程非常容易得到

#include 

#include

#include

#define rep(i,a,b) for (i=a;i<=b;i++)

using

namespace

std;

struct race a[201];

double f[201][201][201];

int n,l,k;

bool cmp(race a,race b)

int main()

rep(i,1,n)

sort(a+1,a+n+1,cmp);

f[0][0][min(k,n)]=1;

rep(i,0,n-1)

rep(j,0,i)

rep(p,0,n)

double ans=0;

rep(i,l,n)

rep(j,0,n)

ans+=f[n][i][j];

printf("%.6lf",ans);

}

3029 守衛者的挑戰 概率與期望DP

三維dp,方程很好寫 令f i,j,k 表示挑戰完前i個,贏了j次,當前收益為k的概率。則f i,j,k fi 1,j 1,k si pi f i 1,j,k 1 p i 我們可以發現,當 k n 時這個狀態並沒有什麼意義,因為此時無論之後怎樣裝都不會使 k 0 所以直接把所以 k n 的狀態都放到...

BZOJ3029 守衛者的挑戰 期望DP

time limit 2 sec memory limit 128 mb submit status discuss 的地圖殘片。地圖殘片必須裝在包包裡才能帶出擂台,包包沒有必要全部裝滿,但是隊員們必須把 獲得的所有的 地圖殘片都帶走 沒有得到的不用考慮,只需要完成所有n項挑戰後揹包容量足夠容納地圖...

BZOJ 3029 守衛者的挑戰 期望DP

題目大意 給定n個事件,第i個事件發生的概率為pi,收益為ai,初始收益為k,求n l 0的概率 令f i j k 表示第i個事件進行後已經發生了j個事件且當前受益為k的概率 mb破輸入法打兩行字錯了十多遍 第三維好大 不會爆?實際上第三維大於n就沒有意義了 因為收益大於n時一定不會扣到負數 因此將...