1. 程式人生 > 資訊 >TCL 電子:吳吉宇因其個人事務辭職,張少勇擔任執行長

TCL 電子:吳吉宇因其個人事務辭職,張少勇擔任執行長

一些規律

  • 狀態轉移方程

    f[i][]表示i這棵子樹怎樣的最優解

  • 用子樹更新父親

    • 一個一個子樹的更新父親(樹上揹包)

    • 計算完所有子樹再更新子樹


題型1:子樹與計數

統計子樹和,通過加減一些子樹滿足題目中的某些性質

  • Garland

    統計以每個點為根的子樹和,合併時遇到一個子樹和為\frac{sum}{3}的節點就記錄下來。

    code

  • 最大子樹和

    統計每個點的子樹和,cut陣列標記刪除。統計的時候每個節點都統計一次。

    code


題型2:樹形揹包問題

一般是讓求在樹上選一些點滿足價值最大的問題

f[i][j]表示i這棵子樹選j個點的最優解

  • 選課

    • 可能為一棵森林,新增0節點,使其變成一棵樹。

    • f[i][j]表示在i及其子樹中選j門課的最大得分。

    • 分組揹包模型,對於一個節點x,有\left | son(x) \right | 組物品,每組物品有t-1個,第i組的第j個物品的體積為j,價值為f[y_i][j],揹包的總體積為t-1

    • code

  • 有線電視網

    • f[i][j]表示在i及其子樹裡滿足j名使用者的最大收益。

    • 統計答案時逆序列舉i,如果有f[1][i]大於等於0,則輸出i

  • 重建道路


題型3:花費最少的費用覆蓋所有點

父親與孩子有聯絡

1.選父親必須不能選孩子(強制)

2.選父親可以不用選孩子(不強制)

  • 保安站崗

    • 屬於第二類

      • 1.x這個點覆蓋x

      • 2.x的兒子節點y覆蓋x

      • 3.x的父親節點fa覆蓋x

    • 分別用f[x][0],f[x][1],f[x][2]表示以x為根的子樹中的所有點全部被覆蓋,x的被覆蓋狀態分別上面的第1,2,3種狀態。

    • f[x][0]+=min(f[y][0],f[y][1],f[y][2])+val[x]

      x已經被自己覆蓋了,y既可以被自己或自己的兒子覆蓋,也可以被x覆蓋。

    • f[x][1]+=min(f[y][0],f[y][1])

      x已經被兒子節點覆蓋了,y可以被自己或自己的兒子覆蓋,但是不能被父親覆蓋。

      當選擇的全部是f[y][1]時,要加上min(f[y][0]-f[y][1])

      x要被自己的兒子覆蓋,但是x的所有兒子y都是被它的兒子所覆蓋的,其實是沒有兒子節點覆蓋y的。此時要選一個最小的差值min(f[y][0]-f[y][1]),強行使一個兒子節點選自己來覆蓋x

    • f[x][2]+=min(f[y][0],f[y][1])

      x已經被父親節點覆蓋了,y可以被自己或自己的兒子覆蓋,但是不能被父親覆蓋。

    • code

  • 沒有上司的舞會

    • 樹的最大獨立集,屬於第一類

    • f[i][0]:在i這棵子樹中,不選i的最大快樂指數。

      f[x][0]+=max(f[y][1],f[y][0])

    • f[i][1]:在i這棵子樹中,選擇i的最大快樂指數。

      f[x][1]+=f[y][0]

    • code

  • Party at Hali-Bula

    • 樹的最大獨立集+判斷方案是否唯一

    • f[i][0/1]:在i這棵子樹中不選/選i的最大人數

      g[i][0/1]:在i這棵子樹中不選/選i的方案是否唯一,g[x][0]0表示方案唯一,為1表示不唯一。

    • f[x][1]+=f[y][0]g[x][1]|=g[y][0]

    • f[x][0]+=max(f[y][1],f[y][0])

      • f[y][1]==f[y][0] g[x][0]=1

        已經有兩種方案了。

      • f[y][1]>f[y][0] g[x][0]|=g[y][1]

      • f[y][0]>f[y][1] g[x][0]|=g[y][0]

    • code


題型4:樹上統計方案問題

給一個條件,問有多少個點的集合滿足這樣的條件。

運用乘法原理,控制一個點不動,看它能做多少貢獻

to be continued……


題型5:與其它演算法結合&&大模擬

  • 風鈴

    • 把題目中的要求變成公式。

    • mindep[i]表示i子樹中最淺的玩具的深度

      maxdep[i]表示i子樹中最深的玩具和深度

      dep[i]表示節點i的深度

    • f[i]表示i這棵子樹中構成滿足條件的玩具所需的運算元。

      加邊時,先新增右邊的玩具後新增左邊的玩具,這樣遍歷到一個節點時,一定會先遍歷右邊的玩具後便利左邊的玩具。

      合併時,f[x]=f[toy[1]]+f[toy[2]]+((mindep[toy[1]]<maxdep[toy[2]])?1:0)

    • n是杆的數量,不是玩具的數量……多開幾倍空間

    • code

      to be continued……


參考: 樹形dp+樹形結構總結