BZOJ1962 模型王子(猜數問題DP)

2021-08-10 03:39:01 字數 1328 閱讀 9015

傳送門

題解:

關於猜數問題可以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...