簡單的期望 狀壓dp

2022-04-14 02:11:30 字數 1452 閱讀 2243

dp定義真的神,

直接的想法是$f[x][maxn]$為第$x$個操作,狀態$maxn$,$maxn$1<<200,好像沒有暴力分高

實際上我們可以這樣定義$f[x][maxn][len][0/1]$表示後八位$maxn$,第九位0\1,第九位之後連續長度為$j$概率

為什麼這樣定義

實際上質因數分解後2的次數就是後面0的個數

+1會破壞已有的0,運算元最多只有200個全部+1後八位已經足夠

最多隻會影響到後九位一次

考慮一種極限情況

現在在最後一位加一會進製

1000000000000000,再怎麼+1都不會再影響到九位之後了

轉移比較簡單具體看**

1 #include2

using

namespace

std;

3#define ll long long

4ll x,n,m,xx,opt,maxn,cnt;

5double p,ans=0;6

double f[210][288][310][2];7

ll cal(ll now)

12int

main()

38else jj=j,tt=t;

39 f[i][now][jj][tt]+=f[i-1][pre][j][t]*(1-p);

40 now=pre<<1;41

if(((now>>8)&1)==t) tt=t,jj=j+1

;

42else tt=t^1,jj=1

;43 now=now&maxn;

44 f[i][now][jj][tt]+=f[i-1][pre][j][t]*p;45}

46for(ll now=1;now<=maxn;now++)//

47for(ll j=1;j<=m;j++)

48for(ll t=0;t<=1;t++)

49if

(f[n][now][j][t])

50 ans+=f[n][now][j][t]*cal(now);

51//

,printf("f[%lld][%lld][%lld][%lld]=%lf\n",n,now,j,t,f[n][now][j][t]);

52//

printf("%.13lf\n",ans);

53for(ll j=1;j<=m;j++)

57 printf("

%.13lf\n

",ans);

58 }

view code

bzoj 1076(狀壓dp)(期望dp)

傳送門 題解 dp i j 表示第i輪狀態為j 狀態中為1的位表示當前物品還沒被取走 的最大期望得分。為了防止從無效狀態轉移至有效狀態,採用倒推法,從已知的有效狀態往回推,具體注釋在 中。p.s.不寫memset可以快接近一倍,但是為了思維嚴密性,還是寫乙個,反正都能過 注意 由於吃過的寶物可以再吃...

抽卡 狀壓DP 期望DP 係數遞推

這題的從狀態定義上就有點特別,考場上沒想到怎麼設定狀態來限制1次克金中m次的抽取。只打了m 1的點,沒取模爆0了。加上是20分。我的狀態定義很簡單,但是這個題如果把每個物品拆成三個然後硬轉移狀態數太多,這樣的話一共有27個物品,顯然1e9就死了。那麼考慮為什麼要狀壓,其實是因為不同種物品概率不同,並...

CF678E(狀壓DP 期望)

4648.noip2016提高a組模擬7.17 錦標賽 problem n nn個人進行n 1 n 1n 1輪淘汰賽。已知i ii戰勝j jj勝率為ai,ja ai,j 求乙個排列使得1 11獲勝概率最大.n 18 n le 18 n 18 solution 首先考慮乙個暴力做法 如果已經知道了排列...