題目大意:
寶物一共有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的物品,所得到的最大期望。若每回合都必...