QBXT2020 3月DP營 Day2上午

2022-05-05 16:33:09 字數 1726 閱讀 1866

dp上樹。

儲存:邊表(鄰接表,鏈式前向星)

(找節點i的子樹大小)

狀態設計:每個節點為狀態;初始化:葉子節點為1;轉移:把兒子們加起來。

順序:從葉子節點不斷向上做到根的過程。

void dfs(int now ,int fa)

}}

規定一棵樹,輸的詩經就是在樹上找到兩個點,使其距離最長,距離即直徑。

思考可得:距離 = \(p_1 => lca(p_1,p_2) => p_2\)

列舉以每個點作為拐點的最長路徑,最後對每個拐點去max。要算以i向下的最長路,以i向下的次長路,分別用f,g。

初始化:f[i]、g[i] = 0

\[f[i] = max(f[j] + 1) \\

次大路就是把當前最大路的子節點去掉之後得到的答案。

\]求樹上路徑的總長度和

\[\sum_^n \sum_^n dis(i,j)

\]g[i]所有點到根節點的距離之和,f[i]表示答案。p1到i的路徑總和為:g[i] = (g[p1] + size[p1]) * (size[i] - size[p1])(size是子樹的大小)。

\[f[i] = \sum_ f[p_j] + (g[p_j] + size[p_j]) \times (size[i] - size[p_j])

\]或者:

\[ans = \sum_^n size[i] \times (n - size[i]) \times 2

\]選出更多的點,使得這些點互不相鄰。(沒有邊)

f[i][0/1]表示i這個點選/不選的方案數。

\[f[i][1] = \sum _f[pi][0] \\

f[i][0] = \sum_ max(f[p_j][0],f[p_j][1]) + 1

\]現在要在一棵樹上布置士兵,每個士兵在結點上,每個士兵可以守護其結點直接相連的全部邊,問最少需要布置多少個士兵。

f[i][0/1/2],對於節點i,0表示兒子保護,1表示自己保護,2表示父親保護。

初始化葉節點:f[i][0] = inf,f[i][1] = 1,f[i][2] = 0;

g[k][0/1]:i節點的前k個兒子是不是已經有乙個兒子放了士兵

\[g[k][0] = g[k-1][0] + f[p_k][0] \\

g[k][1] = min( \\ g[k-1][0] + f[p_k][1], \\ g[k-1][1] + f[p_k][0], \\ g[h-1][0] + f[p_k][1])\\

\\ \\

f[i][0] = \\

f[i][1] = \sum_ min(f[p_j][0],f[p_j][1],f[p_j][2]) + 1;\\

f[i][2] = \sum_ f[p_j][0]

\]依賴揹包問題

每個物品要選必須先選某個指定的物品問能夠獲得的最大價值(今明的預算方案)

把依賴關係用數連起來,f[i][j]表示i的子樹用了j的體積。

初始化:f[i][0] = 0,f[i][vi] = wi,f[i][j] = -inf

轉移:g[i][j]前i個兒子用掉了前j的體積,則g[0][0],g[0][j] = -inf,g[i][j] = max(g[i-1][j-k] + f[pi][k])就是前i個兒子用掉j個體積的最大價值。(逐漸跑題)

轉移:f[i][0] = 0;f[i][j] = g[r][j-vi] + wi;

複雜度\(n * m^2\)

QBXT 二月五號整理

給你一列數 詢問和最大的子串 n 10 6 1 n 10 6 2 include3 include4 using namespace std 5int n,a 105200 6 intmaxsubstr 13 printf d n answer 14 15int main 16 啊!好巧妙,幸虧當時...

2020 3月份前端面試總結 計算機網路相關

1.跨域處理 1.後端設定cors 2.jsonp 3.也可以使用伺服器端 後端 將請求發給我方伺服器,我方伺服器去目標伺服器拿去資料,再將拿到的資料發回給前端頁面 2.jsonp實現原理 動態插入script標籤,通過script標籤引入乙個js檔案,這個js檔案載入成功後會執行我們在url引數中...

dp 小白月賽 迷霧森林

引言 迷霧森林 帕秋莉掌握了一種木屬性魔法 這種魔法可以生成一片森林 類似於迷陣 但一次實驗時,帕秋莉不小心將自己困入了森林 帕秋莉處於地圖的左下角,出口在地圖右上角,她只能夠向上或者向右行走 現在給你森林的地圖,保證可以到達出口,請問有多少種不同的方案 答案對2333取模 輸入描述 第一行兩個整數...