傳送門
題解:
關於猜數問題可以dp解決,詳見** 用
f[i]
[j] 表示當前可以猜
i 次,得到結果是
x<
y次數不超過
j 次的最長猜測區間(也就是從1~
f[i]
[j] 可以被猜測出來)。如果能求出這個dp值,這道題就做完了(直接列舉找到第乙個大於
n 的)。
現在假設我們當前狀態為f[
i][j
],考慮如何轉移。對於c
=0的情況:
先假設猜測的數為p(
p∈[1
,f[i
][j]
]),如果得到是大於的結果,那麼下次猜測[1
,p−1
] ,反之猜測[p
+1,f
[i][
j]] 。但是有不同的是,如果得到了小於,那麼
x<
y 的次數有增加了1。
現在要最大化f[
i][j
] ,也就是要最大化兩邊的猜測區間。
根據dp定義,前面的區間是f[
i−1]
[j] ,後面的區間是f[
i−1]
[j−1
] ,直接dp即可。
最大化之後只要保證p選取的位置是1+
f[i−
1][j
] ,無論結果如何,總能得出最後的值,而且這個區間不能在擴大。對於c
=1的情況:
同樣假設猜測的數為
p ,現在不能得到正確結果,那麼只能再假設下乙個p′
,對於猜測的p′
有兩種情況: 1.p
′如果得到大於的結果,那麼前一次詢問浪費,處理右邊的詢問區間,長度最長為f[
i−2]
[j] ,如果得到了小於的結果,那麼前一次的詢問沒有浪費,處理左邊的區間,長度最長為f[
i−1]
[j−1
] .p′
就好了。2.p
′>p
推的方法同上。
因為兩種方案都合法,而且只能選擇猜測一邊,應該取max.
#include
using
namespace
std;
inline
int read()
while(isdigit(ch))
return i*f;
}int n,k,f[100050][105];
inline
void solve()
}}int main()
bzoj4008 亞瑟王 概率dp
重述題意 卡牌有發動概率和傷害,每張卡牌只發動一次,按順序遍歷,給出輪數,求傷害期望。神思路啊 我的腦子基本想不出來 如果說正面剛,剛一天也剛不掉,我們換個思路,用f i j 表示第i張卡被遍歷j次的概率。這個概率可以分為兩部分 1 第i 1張卡被遍歷j次且一直沒發動。這一段公式為f i 1 j 1...
bzoj 1924 所駝門王的寶藏
題目大意 有乙個r c的矩陣,上面有n個點有寶藏 每個有寶藏的點上都有傳送門 傳送門有三種 第一種可以傳到該行任意乙個有寶藏的點,第二種可以傳到該列任意乙個有寶藏的點,第三種可以傳到周圍的八連塊上有寶藏的點 現在你可以在任意乙個有寶藏的點開始,求你最多可以經過多少個不同的藏寶點 每個藏寶點可以多次進...
BZOJ1924 所駝門王的寶藏 KEY
題目傳送門 這道題苟了我好久,因為鍊錶的記憶體問題,之後再細講。首先這是一道tarjan dag上dp的題目。有三種門,對於每種門可以和其他門相連。即連邊。使用鍊錶快速查詢連邊。建完圖後可以進行tarjan縮點。然後做一遍dag上dp就好了。記搜 然後因為建圖時會有很多條邊,而行列最多只有10000...