洛谷 P2458 SDOI2006 保安站崗

2022-04-07 00:38:00 字數 1149 閱讀 8544

樹形dp

可知乙個點被控制有且僅有一下三種情況:

1、被父親節點上的保安控制

2、被兒子節點上的保安控制

3、被當前節點上的保安控制

我們設dp[0/1/2][u]表示u節點所在子樹中全部被控制的最小代價,0表示只有u節點尚未被控制(等待被其父親節點控制);

1表示u節點已經被控制,但u節點上沒有保安,所以不能去控制其父親節點;2表示u節點上有保安

(機房的神犇說多維陣列要把小的那一維寫在前面,因為可以優化常數,原理請自行翻閱一本通)

轉移:(以下設v是u的兒子節點)

dp[0][u]=∑min(dp[1][v],dp[2][v]) i節點上反正沒有保安,那麼兒子節點只要保證全部控制即可,顯然1,2狀態都是滿足的

dp[1][u]=∑min(dp[1][v],dp[2][v]) + 某乙個dp[2][v] 也就是說對於其中乙個兒子取dp[2][v]而其他兒子取min(dp[1][v],dp[2][v])意為i號點必須要找乙個兒子來覆蓋它,其餘隨意。這個地方涉及到了演算法複雜度的問題,樓下有些題解在這裡寫的是o(n^2)的轉移,但實際上完全可以做到o(n)。具體在**中細講。

dp[2][u]=∑min(dp[0][v],dp[1][v],dp[2][v])+val[u] 這個就簡單了,i號點上反正有保安了,所有兒子節點都無所謂了,全部可以轉移。

1 #include2 #include3 #include4 #include5

6using

namespace

std;78

int n,a[1502],k,m,f[1502][3

];9 vector l[1502

];10

11 inline void dfs(int root,int

fa)

25if(!flag)

26 f[root][1] +=_min;27}

2829

intmain() 39}

40 memset(f,0,sizeof

(f));

41 dfs(1,-1

);42 printf("

%d",min(f[1][1],f[1][2

]));

43return0;

44 }

SDOI2006 保安站崗 洛谷p2458

五一來臨,某地下超市為了便於疏通和指揮密集的人員和車輛,以免造成超市內的混亂和擁擠,準備臨時從外單位呼叫部分保安來維持交通秩序。已知整個地下超市的所有通道呈一棵樹的形狀 某些通道之間可以互相望見。總經理要求所有通道的每個端點 樹的頂點 都要有人全天候看守,在不同的通道端點安排保安所需的費用不同。乙個...

洛谷P2434 SDOI 區間

解題思路 這道題就是簡單的模擬啊。不過愣是沒有模擬對,看來還需要加強 實現能力。先按照左端點從小到大排序,每次驗證當前區間左端點是否大於設定的右端點,如果大於,說明不相交,就輸出設定的左右端點,如果小於等於,說明有相交的部分,不斷更新右端點。include include include inclu...

洛谷P2455 SDOI2006 線性方程組

已知n元線性一次方程組。其中 n 50,係數是 b color red 整數 100 有負數 bi的值都是整數且 300 有負數 特別感謝u14968 mmqqdd提出題目描述的說明 redbag 是mqd自己要我寫的 color b 程式設計任務 根據輸入的資料,程式設計輸出方程組的解的情況。輸入...