傳送門啦
乙個很摸不清頭腦的樹形dp
狀態:$ dp[i][0] $ :選自己
$ dp[i][1] $ :選了至少乙個兒子
$ dp[i][2] $ :選了至少乙個孫子
-----------------------------------覆蓋了自己的
$ dp[i][3] $ : 兒子孫子全部覆蓋
$ dp[i][4] $ :孫子全部覆蓋
-----------------------------------並沒有覆蓋自己
初始轉移方程:
$ dp[i][0] = 1+\sum min(dp[j][0...4]) $ ;
要使選了根節點之後合法(整棵子樹包括根節點被覆蓋)必須使兒子的孫子全部覆蓋, 0~4狀態滿足
$ dp[i][1] = min( dp[k][0] + \sum min(dp[j][0...3](j != k)) ) $ ;
要使選了乙個兒子之後合法 由於兒子只可以覆蓋到兄弟 所以孫子一定要全部被覆蓋 即兒子的兒子一定覆蓋 0~3滿足
$ dp[i][2] = min( dp[k][1] + \sum min(dp[j][0...2](j != k)) ) $ ;
使選了乙個孫子之後合法 由於孫子最多只能覆蓋到當前節點 所以兒子一定全部覆蓋 即所有兒子本身要被覆蓋 0~2滿足
$ dp[i][3] = \sum dp[j][0...2] $ ;
要使兒子及孫子全部被覆蓋 即兒子本身要被覆蓋 0~2滿足
$ dp[i][4] = \sum dp[j][0...3]; $
要使孫子全部被覆蓋 即兒子的兒子要全部被覆蓋 0~3滿足
注意:每種狀態由兒子轉移過來所以根的情況 要轉化成對於兒子來說的情況
然後改進狀態 因為每種轉移方程至少有三種可能最後取其中較小的 故時間效率較低
令 $ dp[i][k] $ 表示 $ min(dp[i][0],dp[i][1]....dp[i][k]) $ 且 $ k>=2 $ 因為上述轉移方程最少都是0~2狀態
那麼轉移方程就大幅度化簡了:
$ dp[i][0] = 1+\sum dp[j][4] $ ;
直接由上面變形而來
$ dp[i][1] = dp[i][4] + min(dp[k][0]-dp[k][3]) $ ;
選乙個兒子 需保證所有孫子被覆蓋 即 $ dp[i][4] $ 然後要選出乙個兒子 將他從0~3狀態變為選了自己(由於 $ dp[i][4] $ 中他是3狀態所以要減去乙個 $ dp[k][3] $ ) 取這個差值最小的兒子
$ dp[i][2] = dp[i][3] + min(dp[k][1]-dp[k][2]) $ ;
選乙個孫子 與上面類似 要保證所有兒子都被覆蓋 即 $ dp[i][3] $ 再將乙個兒子從02狀態變為01狀態以保證覆蓋他父節點
$ dp[i][3] = \sum dp[j][2] $ ;
保證所有兒子被覆蓋 兒子的0~2狀態均符合條件
$ dp[i][4] = \sum dp[j][3] $ ;
保證所有兒子的兒子被覆蓋 兒子的0~3狀態均符合條件
#include #include #include #include using namespace std;
const int maxn = 1005;
inline int read()
while(ch >= '0' && ch <= '9')
return x * f;
}int n,a[maxn][maxn];
int f[maxn][5];
int main()
for(int i=n;i>=1;i--)
} f[i][1] = f[i][4] + x1;
f[i][2] = min(f[i][3] + x2 , min(f[i][0] , f[i][1]));
f[i][3] = min(f[i][2] , f[i][3]);
f[i][4] = min(f[i][3] , f[i][4]);
} printf("%d",f[1][2]);
return 0;
}
dfs 洛谷 P2279 消防局的設立
題目描述 2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,...
洛谷2279消防局的設立
題目描述 2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,...
洛谷2279 消防局的設立
資料範圍 f i,3 表示 i 的所有兒子節點一定被消防局覆蓋。f i,4 表示 i 的所有孫子節點一定被消防局覆蓋。轉移方程 f i,1 min f k,0 sum min f j,0.3 f i,2 min f k,1 sum min f j,0.2 f i,3 sum min f j,0.2 ...