題意: 給一棵樹,每條邊上有一些權值,求 長度不超過 x ,最多能走多少個點;
分析:考慮每乙個節點,他可以一直走下去,也可以走回來而走到他的兄弟節點;
狀態定義:
d[x][j][0/1] 從 i 出發,走 j 個節點的最短距離;
1、回來,這就是乙個揹包,更新當前節點;
2、不回來,則是要考慮從哪個部分不回來;
1 #include 2view code3using
namespace
std;45
intn;
6const
int maxn = 550;7
const
int inf = 0x3f3f3f3f
;8 vector g[maxn];
9int
cnt[maxn];
10int
son[maxn];
1112
int d[maxn][maxn][2
];13
14void dfs(int
x) 32}33
34 son[x] +=son[y];35}
36}3738
intmain()
5253
int root = 0;54
for(int i=1; i)
55if(!cnt[i])
56 root =i;
5758
dfs(root);
59int
q,x;
60 scanf("
%d",&q);
61 printf("
case %d:\n
",cas++);
62while (q--)
7071}72
return0;
73 }
膜拜貓奴大牛;
la4015 樹形dp(狀態設計)(不會)
其實也沒有那麼難,只是自己不敢想 先把解法說一下,因為要用dp麼,根據樹的遞迴的特性設計狀態,因為題目要求的是各種距離最多能訪問到多少點 但是以距離作為狀態會空間不夠用,所以要把值比較大的東西存成資料,作為dp的值而不是狀態量 dp需要考慮哪些狀態?1.那個節點出發是必須的。2.決策要考慮要不要走回...
LA4015,論DP中順序的重要性
樹形dp,設f u,i 為從u出發,遍歷了i個點 包括u自身 的最短距離,g u,i 表示從u出發,遍歷了i個點 不包括u自身 的最短距離。記x到y的距離為dis x,y 狀態轉移方程 f x,i min f x,i j f y,j dis x,y 2 y是x的兒子 g x,i min f x,i ...
uvalive4015 (樹上揹包)
給一棵樹,邊上有權值,然後給乙個權值x,問從根結點出發,走不超過x的距離,最多能經過多少個結點。走過的點可以重複走,所以可以從乙個分支走下去,然後走回來,然後再走另乙個分支 dp u j 0 表示從u出發,走了j個點,然後不回到u點的最小花費 dp u j 1 表示從u出發,走了j個點,然後回到u點...