這題的從狀態定義上就有點特別,考場上沒想到怎麼設定狀態來限制1次克金中m次的抽取。只打了m=1的點,沒取模爆0了。加上是20分。
我的狀態定義很簡單,但是這個題如果把每個物品拆成三個然後硬轉移狀態數太多,這樣的話一共有27個物品,顯然1e9就死了。
那麼考慮為什麼要狀壓,其實是因為不同種物品概率不同,並不等價,所以我們要進行轉移是要知道該乘誰的概率,那麼對於每種物品的每種顏色來說,這概率都相等,就直接記錄個數就行了,最多有3個,正好0 1 2 3是4個狀態,一種物品4個狀態,4進製剛剛好。狀態數26萬多可過。(插頭dp打下的基礎。。。。)
我的定義是每個物品數狀態為s的期望購買次數為$f[s]$,那麼就可以直接轉移了,$f[s]=\sum \limits_^ q[i]*(sum/3*f[s][i]+(3-sum(s,i))/3*f[add(s,i)]+1$add為在s狀態上把第i個物品數加1的新狀態,但是如果已經為3那麼新狀態不再變化,化簡一下轉移方程,自己從自己轉移過來,自環很好處理,手解方程即可。記錄一下係數和常數直接作除就行了。
然後就考慮怎麼拿別的分數,發現我的這個轉移它一次購買能抽很多次,然後狀態就能從很多很多轉移過來,需要列很多很多,而且概率也有很多很多,貌似是dfs才能處理的那種,就是列舉每一次抽到什麼。
這種時候就要考慮原來把dfs搞成dp,現在也得把這個dfs搞成dp,那麼需要加一維。
設$f[s][k]$為已有狀態為s,此時本次購買已經抽了k次的期望購買次數,這種求期望次數的dp,一定不能把次數放到狀態裡,因為這個東西有可能是無限次,概率很小,然後貢獻答案。那麼轉移是很顯然的。首先$f[滿狀態][k]=0$
$f[s][k]=\sum \limits_^ p[i]*(sum/3*f[s][k+1]+(3-sum)/3*f[add(s,i)][k+1])$
當$f[s][m]$進行轉移時表明狀態s已經對其他次數做了貢獻,留下來的要往後接著轉移就是$f[s][0]=f[s][m]+1$
這玩意有後效性,但如果把$f[s]$的轉移關係列出來只是乙個環,這就好辦了。
我們的方法是:係數遞推。這是個套路化的化簡方法,應用於單環的方程組線性求解,先體會一下過程。以下省略第一維狀態
設$f[k]=a[k]*f[m]+b[k]$
然後有$f[k-1]=t*f[k]+d$這些係數顯然都是可以求的。
那麼$f[k-1]=t*(a[k]*f[m]+b[k])+d$
$f[k-1]=t*a[k]*f[m]+t*b[k]+d$
因為$f[k-1]=a[k-1]*f[m]+b[k-1]$
然後發現就得到了$a[k-1]=t*a[k]$ $b[k-1]=t*b[k]+d$
在逆推的情況下係數可以直接得到,
那麼我們這麼做的目的就出來了,要得到$f[0]=a[0]*f[m]+b[0]$
然後$f[0]=f[m]+1$接下來不用交給高斯了,交給手就行了
推出f[m]以後再用$f[k]=a[k]*f[m]+b[k]$推一遍。
所以係數遞推基本思路就是,如果每個方程都能寫成乙個單環的遞推,設0為起始點,通過一條0到m的邊得到乙個方程,m繞一圈到0的邊通過迭代遞推的到m到0的方程,交給手解出來。
#include#includeview code#include
using
namespace
std;
const
int n=9,m=65,mod=2000000011
;long
long f[1
<
];inline
long
long
rd()
inline
long
long qpow(long
long a,long
long
k)inline
long
long inv(long
long a)
inline
int find(int s,int j)
inline
int add(int s,int j)
intmain()
a[k]=t*a[k+1]%mod;b[k]=(t*b[k+1]%mod+d)%mod;
}f[s][m]=(1ll+b[0]+mod)%mod*inv((1ll-a[0]+mod)%mod)%mod;
for(int k=m-1;k>=0;k--)f[s][k]=(a[k]*f[s][m]%mod+b[k])%mod;
}printf(
"%lld\n
",f[0
][m]);
return0;
}/*g++ -std=c++11 1.cpp -o 1
./11 1
5050
*/
bzoj 1076(狀壓dp)(期望dp)
傳送門 題解 dp i j 表示第i輪狀態為j 狀態中為1的位表示當前物品還沒被取走 的最大期望得分。為了防止從無效狀態轉移至有效狀態,採用倒推法,從已知的有效狀態往回推,具體注釋在 中。p.s.不寫memset可以快接近一倍,但是為了思維嚴密性,還是寫乙個,反正都能過 注意 由於吃過的寶物可以再吃...
簡單的期望 狀壓dp
dp定義真的神,直接的想法是 f x maxn 為第 x 個操作,狀態 maxn maxn 1 200,好像沒有暴力分高 實際上我們可以這樣定義 f x maxn len 0 1 表示後八位 maxn 第九位0 1,第九位之後連續長度為 j 概率 為什麼這樣定義 實際上質因數分解後2的次數就是後面0...
狀壓dp 玉公尺田 狀壓dp
相關 強相關 327.玉公尺田 狀壓dp 小國王 狀壓dp 是井字形,本題是十字形。思路 狀態計算 時間複雜度 n 2 n 2n o n 22n 12 2 24n 2 n 2 n o n2 12 2 n 2n 2 n o n22n 12 224 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...