樹形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 #include56using
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 程式設計任務 根據輸入的資料,程式設計輸出方程組的解的情況。輸入...