BZOJ 1076 獎勵關 狀態壓縮DP

2022-07-17 10:39:08 字數 1700 閱讀 4420

題目大意:

寶物一共有n種,系統每次丟擲這n種寶物的概率都相同且相互獨立。也就是說,即使前k-1次系統都丟擲寶物1(這種情況是有可能出現的,儘管概率非常小),第k次丟擲各個寶物的概率依然均為1/n。 獲取第i種寶物將得到pi

分,但並不是每種寶物都是可以隨意獲取的。第i種寶物有乙個前提寶物集合si。只有當si中所有寶物都至少吃過一次,才能吃第i種寶物(如果系統丟擲了乙個目前不能吃的寶物,相當於白白的損失了一次機會)。注意,pi可

以是負數,但如果它是很多高分寶物的前提,損失短期利益而吃掉這個負分寶物將獲得更大的長期利益。 假設你採取最優策略,平均情況你一共能在獎勵關得到多少分值?

思路:

這一步的期望=(上一步的期望+這一步的得分)/k

逆向推

1 #include2

#define ios ios::sync_with_stdio(false);//

不可再使用scanf printf

3#define max(a, b) ((a) > (b) ? (a) : (b))//

禁用於函式,會超時

4#define min(a, b) ((a) < (b) ? (a) : (b))

5#define mem(a) memset(a, 0, sizeof(a))

6#define dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1))

7#define mid(l, r) ((l) + ((r) - (l)) / 2)

8#define lson ((o)<<1)

9#define rson ((o)<<1|1)

10#define accepted 0

11#pragma comment(linker, "/stack:102400000,102400000")//

棧外掛程式12

using

namespace

std;

13 inline int

read()

1417

while (ch>='

0'&&ch<='9')

18return x*f;19}

20 typedef long

long

ll;21

const

int maxn = 10;22

const

int mod = 1000000007;//

const引用更快,巨集定義也更快

23const

int inf = 1e9 + 7;24

const

double eps = 1e-10;25

const

double pi = acos(-1

);26

27double v[20

];28

int d[20

];29

double dp[101][70000

];30

intmain()

3139

for(int i = k; i >= 1; i--)

4049

}50 printf("

%.6f\n

", dp[1][0

]);51

return

accepted;

52 }

bzoj1076 獎勵關 概率dp 狀態壓縮

第一行為兩個正整數 k 和 n 即寶物的數量和種類。以下 n 行分別描述一種寶物,其中第乙個整數代表分值,隨後的整數依次代表該寶物的各個前提寶物 各寶物編號為 1到 n 以 0 結尾。輸出乙個實數,保留六位小數,即在最優策略下平均情況的得分。1 21 0 2 01.500000 資料規模 1 k 1...

bzoj1076 獎勵關 期望dp

題目傳送門 題目大意 總共有k次彈出寶物的機會,寶物共有n種,彈出不同的寶物的概率相同的,是每個寶物都有價值,和選擇這個寶物的限制 必須具有特定的寶物 問最後的最優期望是多少。思路 正向推概率,反向推期望。一看資料範圍就知道肯定是狀壓。這裡推薦乙個大佬的部落格 考慮f i j j為二進位制數,表示在...

BZOJ1076 獎勵關(狀壓期望dp)

好像noip一眼看去,全是dp。題面題意 有k個回合,n個物品,每回合隨機掉乙個物品i,有p i 的價值。可以選擇撿或不撿。對於每件物品,若想撿它,都要撿完它的先決物品,問最大期望價值。n 15,k 100。大概就是個狀壓dp,用f s i 表示i回合選了集合s的物品,所得到的最大期望。若每回合都必...