LA 4015 樹形揹包

2022-04-01 07:02:00 字數 986 閱讀 9787

題意: 給一棵樹,每條邊上有一些權值,求 長度不超過 x ,最多能走多少個點;

分析:考慮每乙個節點,他可以一直走下去,也可以走回來而走到他的兄弟節點;

狀態定義: 

d[x][j][0/1] 從 i 出發,走 j 個節點的最短距離;

1、回來,這就是乙個揹包,更新當前節點;

2、不回來,則是要考慮從哪個部分不回來;

1 #include 2

3using

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 }

view code

膜拜貓奴大牛;

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點...