Noip前的大抱佛腳----動態規劃
動態規劃
序列DP
有些問題:
求長度為\(l\)的上升子序列個數
形如一個值域的字首和的形式,還要支援插入,所以可以用樹狀陣列優化DP,\(O(n^2logn)\)求解([BZOJ4361]isn)
求最長上升子序列長度
兩種做法,前者拓展性更強
設\(f[i]\)表示到第\(i\)個位置的最長上升子序列長度,則\(f[i]=max(f[j]+1),j<=i\&\&A[j]<A[i]\),用值域樹狀陣列優化字首\(max\)即可
設\(f[i]\)表示最長上升子序列長度為\(i\)的最小結尾值,可以知道\(f\)是單調遞增的。新加入一個數\(x\)
如果求的是不降子序列那找到嚴格大於\(x\)的位置即可
關於最長上升子序列,有一個很神奇的性質:擁有雙權值的序列,對其一維排序,對另一維做\(LIS\)答案相同
這個性質彷彿並沒有什麼用.....證明:對某一維排序並不影響兩個元素間的二維偏序關係
序列為樹的前序遍歷,則為區間DP問題
考慮方向:
- 對區間DP
- 對長度DP
- 考慮倍增優化
揹包問題
- 充分利用好題目條件,隱含著物品有無限制、不會超過\(\sqrt n\)個等條件
- 物品代價的整倍數,用同餘系的單調佇列優化
狀態壓縮以及拆分數
在點數很少的情況下可以進行狀態壓縮
點如果是沒有區別的,可以採用拆分數進行更大資料範圍的操作,再組合計數即可
\(40\)內的拆分數在\(4W\)以內
期望概率DP
馬爾可夫過程
大概就是說狀態可以回退,自己可以轉移給自己或者自己之前的狀態,這就需要高斯消元了
- [JLOI2012]時間流逝
樹上馬爾可夫過程,\(f[i]=Pf[fa]+(\sum f[son])+1\)
需要高斯消元但是時間不夠,介紹一種 \(O(n)\)
假設\(f[i]=kf[fa]+b\),然後依次可以推匯出\(f[i]=\frac{P}{1-A\sum k}f[fa]+\frac{1+A\sum b}{1-A\sum k}\),從而表示這個表示可行,然後對於每個點算\(k\)和\(b\)就可以得到根的答案了
一類生成樹計數問題
樹的生成方式為:每次在當前的樹的結構上隨機選取一個點,在其下方掛上一個結點
已經遇到的題目:
問期望高度(10.17T2)
設\(f[i][j]\)表示放了\(i\)個結點,高度不超過\(j\)的方案數,轉移是\(f[i][j]=f[k][j-1]+f[i-k][j]\),表示為一棵樹連到了另一棵樹的根。最後除以階乘即可。
問期望\(\sum_{i=1}^{n}\sum_{j=1}^{n}dis(i,j)\)(HAOI2018蘋果樹)
考慮每一條邊產生的貢獻,列舉\(i\)點的\(siz\),然後乘上\(1-i\)的生成方式、\(i\)子樹的生成方式、其他地方的生成方式、以及i子樹內選擇編號的方案數
平方計數
求\(\sum a^2\)
- 如果\(a\)是到達某種狀態的方案數,那麼可以等價為求兩種操作序列最後得到的狀態相同的方案數(NOI2009管道取珠)