擂台賽一共有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時一定不會扣到負數 因此將...