[BZOJ 1076][SCOI2008]奖励关(期望+状压Dp)
Description
你正在玩你最喜歡的電子游戲,并且剛剛進(jìn)入一個(gè)獎(jiǎng)勵(lì)關(guān)。在這個(gè)獎(jiǎng)勵(lì)關(guān)里,系統(tǒng)將依次隨機(jī)拋出k次寶物,
每次你都可以選擇吃或者不吃(必須在拋出下一個(gè)寶物之前做出選擇,且現(xiàn)在決定不吃的寶物以后也不能再吃)。
?寶物一共有n種,系統(tǒng)每次拋出這n種寶物的概率都相同且相互獨(dú)立。也就是說(shuō),即使前k-1次系統(tǒng)都拋出寶物1(
這種情況是有可能出現(xiàn)的,盡管概率非常小),第k次拋出各個(gè)寶物的概率依然均為1/n。 獲取第i種寶物將得到Pi
分,但并不是每種寶物都是可以隨意獲取的。第i種寶物有一個(gè)前提寶物集合Si。只有當(dāng)Si中所有寶物都至少吃過(guò)
一次,才能吃第i種寶物(如果系統(tǒng)拋出了一個(gè)目前不能吃的寶物,相當(dāng)于白白的損失了一次機(jī)會(huì))。注意,Pi可
以是負(fù)數(shù),但如果它是很多高分寶物的前提,損失短期利益而吃掉這個(gè)負(fù)分寶物將獲得更大的長(zhǎng)期利益。 假設(shè)你
采取最優(yōu)策略,平均情況你一共能在獎(jiǎng)勵(lì)關(guān)得到多少分值?
Solution
這一步的期望=(上一步的期望+這一步的得分)/n
倒推地做會(huì)方便很多…
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<vector> using namespace std; int k,n,p[20],s[105]; double f[105][1<<16],ans=0; int read() { int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int main() { k=read(),n=read(); for(int i=1;i<=n;i++) { p[i]=read(); int x=read(); while(x) { s[i]|=(1<<x); x=read(); } } for(int i=k;i>0;i--) for(int k=0;k<(1<<(n+1));k++) { for(int j=1;j<=n;j++) if((k&s[j])==s[j]) f[i][k]+=max(f[i+1][k],f[i+1][k|(1<<j)]+p[j]); else f[i][k]+=f[i+1][k]; f[i][k]/=n; } printf("%lf\n",f[1][0]); return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/Zars19/p/6914644.html
總結(jié)
以上是生活随笔為你收集整理的[BZOJ 1076][SCOI2008]奖励关(期望+状压Dp)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《嵌入式系统可靠性设计技术及案例解析》读
- 下一篇: HBase Replication源码解