題目傳送門
題目大意:總共有k次彈出寶物的機會,寶物共有n種,彈出不同的寶物的概率相同的,是每個寶物都有價值,和選擇這個寶物的限制(必須具有特定的寶物),問最後的最優期望是多少。
思路:「正向推概率,反向推期望。」,一看資料範圍就知道肯定是狀壓。
這裡推薦乙個大佬的部落格
考慮f[ i ][ j ],j為二進位制數,表示在第i個格仔之前具有了 j 的狀態,那在這個格仔,對於每乙個物體,有能吃和不能吃兩種情況。(用( j | t)==j 來判斷j是否包含了t)。
對於能吃情況(即滿足限制條件),那我可以選擇吃或者不吃,由於我已經算出了第i+1層的所有期望,所以我只要選擇吃和不吃裡的最大值就可以了,由於這個格子彈出的物品總共有n種情況,所以要記得概率要除以n。
f[i][j]+=max(f[i+1][j],f[i+1][j|(1<<(x-1))]+w[x])/n;//每乙個x都對應1/n的情況,每個i,j都有兩個方向,即這個東西吃還是不吃
對於不能吃的情況,只能選擇不吃。
f[i][j]+=f[i+1][j]/n;//只有乙個方向
所以這樣dp結束後,f[ 1 ][ 0 ]就是我們要的答案。
為什麼期望要倒著做呢,第一,正著做wa了。。。第二,倒著做保證了dp時全是合法的情況。
#include#define clr(a,b) memset(a,b,sizeof(a))using
namespace
std;
typedef
long
long
ll;double dp[110][50000],f[110][50000],w[20
];int t[20
];int
k,n;
intmain()
}for(int i=k;i>0;i--)}}
printf(
"%.6f\n
",f[1][0
]);}
time limit: 10 sec memory limit: 128 mb
submit: 3830 solved: 2071
[submit][status][discuss]
第一行為兩個正整數k和n,即寶物的數量和種類。以下n行分別描述一種寶物,其中第乙個整數代表分值,隨
後的整數依次代表該寶物的各個前提寶物(各寶物編號為1到n),以0結尾。
輸出乙個實數,保留六位小數,即在最優策略下平均情況的得分。
1 21 0
2 01.500000
【資料規模】
1<=k<=100,1<=n<=15,分值為[-10^6,10^6]內的整數。
BZOJ1076 獎勵關(狀壓期望dp)
好像noip一眼看去,全是dp。題面題意 有k個回合,n個物品,每回合隨機掉乙個物品i,有p i 的價值。可以選擇撿或不撿。對於每件物品,若想撿它,都要撿完它的先決物品,問最大期望價值。n 15,k 100。大概就是個狀壓dp,用f s i 表示i回合選了集合s的物品,所得到的最大期望。若每回合都必...
BZOJ 1076 獎勵關 狀壓期望DP
當前得分期望 上一輪得分期望 這一輪得分 m dp i,j 第i輪拿的物品方案為j的最優得分期望 如果我們正著去做,會出現從不合法狀態 比如前i個根本無法達到j這種方案 所以從後向前推 如果當前方案j裡具備了取k這個物品的條件 那麼dp i,j max 否則dp i,j dp i 1,j inclu...
BZOJ 1076 獎勵關 狀態壓縮DP
題目大意 寶物一共有n種,系統每次丟擲這n種寶物的概率都相同且相互獨立。也就是說,即使前k 1次系統都丟擲寶物1 這種情況是有可能出現的,儘管概率非常小 第k次丟擲各個寶物的概率依然均為1 n。獲取第i種寶物將得到pi 分,但並不是每種寶物都是可以隨意獲取的。第i種寶物有乙個前提寶物集合si。只有當...