第一行為兩個整數,分別表示丟擲寶物的次數 \(k\) 和寶物的種類數 \(n\)。
第 \(2\) 到第 \(\left(n + 1\right)\) 行,第 \(\left(i + 1\right)\) 有若干個整數表示第 \(i\) 個寶物的資訊。每行首先有乙個整數,表示第 \(i\) 個寶物的分數 \(p_i\)。接下來若干個互不相同的整數,表示該寶物的各個前提寶物集合 \(s_i\),每行的結尾是乙個整數 \(0\),表示該行結束。
輸出一行乙個實數表示答案,保留六位小數。
首先列舉狀態我們需要考慮狀壓, 設計狀態為f[k][s]
, 表示在第 \(k\) 秒, 選擇寶物的狀態為 \(s\).
然後發現正序是無法 dp 的, 因為每種狀態的轉移會受到前一種狀態的影響 (每種寶物的選擇會受到前置寶物的影響),
於是考慮倒序, 從f[k+1][s]
向前轉移.
轉移方程:
\[當前考慮的寶物可取: f\left(k, s\right) =\left(f\left(k, s\right) + \max\left(f\left(k+1, s\right), f\left(k+1, s'\right)+p\left(t\right)\right)\right) \div n, 其中 s \subset s' \\
當前考慮的寶物不可取: f\left(k, s\right) = \left(f\left(k, s\right) + f\left(k+1, s\right)\right) \div n
\]**:
# include # include # define maxk 105
# define maxn 15
using namespace std;
int k, n;
int p[maxk];
int pre[maxk]; // pre 記錄每個點的前置點
double f[maxk][1<= 1; i--) // 列舉時間
for(int j = 0; j < (1
}printf("%.6lf", f[1][0]);
return 0;
}
SCOI2008 獎勵關 狀壓 期望dp
傳送門 題意 有n種卡 n 15 k輪遊戲,每輪遊戲可以抽一張卡 每一輪抽出每種卡的概率都是1 n 卡的價值為ai ai可以為負數 並且某些卡需要另一些卡作為引導即只有在得到某些卡的時候才能獲得這些卡,每輪遊戲抽到的卡可以選擇獲得 前提是前驅卡已經獲得 或者不獲得,求選擇最優策略的情況下的總價值的期...
SCOI2008 獎勵關 題解(狀壓DP 期望)
題目鏈結 題目大意 給定 n 個寶物,每次隨機丟擲乙個寶物,獎勵分數為 p i 但如果選這個寶物必須選過它的前置寶物集合。共進行 k 輪問最優策略下的期望。n leq 15,10 6 leq p i leq 10 6 看到資料範圍,狀壓很容易想到。設 f i j 表示到了第 i 輪,寶物取捨狀態為 ...
bzoj1076 獎勵關 期望dp
題目傳送門 題目大意 總共有k次彈出寶物的機會,寶物共有n種,彈出不同的寶物的概率相同的,是每個寶物都有價值,和選擇這個寶物的限制 必須具有特定的寶物 問最後的最優期望是多少。思路 正向推概率,反向推期望。一看資料範圍就知道肯定是狀壓。這裡推薦乙個大佬的部落格 考慮f i j j為二進位制數,表示在...