1. 程式人生 > >Noip前的大抱佛腳----動態規劃

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\)的第一個位置\(j\)\(f[j]=x\),意思是長度為\(j\)的最長上升子序列可以在\(j-1\)的基礎上接\(x\)而不是接\(f[j]\),同時對其他的\(f\)不影響。如果\(x\)大於了最大值,\(f\)往後加一位

      如果求的是不降子序列那找到嚴格大於\(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管道取珠)