bzoj4813 Cqoi2017 小Q的棋盤

2022-05-02 04:48:14 字數 1524 閱讀 6912

小q正在設計一種棋類遊戲。在小q設計的遊戲中,棋子可以放在棋盤上的格點中。某些格點之間有連線,棋子只能在有連線的格點之間移動。整個棋盤上共有v個格點,編號為0,1,2…,v-1,它們是連通的,也就是說棋子從任意格點出發,總能到達所有的格點。小q在設計棋盤時,還保證棋子從乙個格點移動到另外任一格點的路徑是唯一的。小q現在想知道,當棋子從格點0出發,移動n步最多能經過多少格點。格點可以重複經過多次,但不重複計數。

第一行包含2個正整數v,n,其中v表示格點總數,n表示移動步數。

接下來v-1行,每行兩個數ai,bi,表示編號為ai,bi的兩個格點之間有連線。

v,n≤ 100, 0 ≤ai,bi輸出一行乙個整數,表示最多經過的格點數量。

5 21 0

2 13 2

4 33

從格點 0 出發移動 2 步。經過 0, 1, 2 這 3 個格點。

正解:樹形$dp$。

比較簡單的樹形$dp$。設$f[x][i]$為$x$出發,走$i$步,沒有回到$x$的最多點數;$g[x][i]$為$x$出發,走$i$步,回到$x$的最多點數。

然後有$3$個轉移,分別是$x$從自己沒走回來的狀態和兒子走回來的狀態轉移;從自己走回來的狀態和兒子沒走回來的狀態轉移;還有乙個就是$g$的轉移。

1

//it is made by wfj_2048~

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include

13#define inf (1<<30)

14#define n (510)

15#define il inline

16#define rg register

17#define ll long long

18#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

1920

using

namespace

std;

2122

struct edgeg[n];

2324

intf[n][n],t[n][n],h[n],l[n],head[n],n,k,num;

2526 il int

gi()

3334 il void insert(rg int

from,rg int

to),head[from]=num; return;36

}3738 il void dfs(rg int x,rg int

p)49}50

for (rg int i=1;i<=k;++i) f[x][i]=max(f[x][i],f[x][i-1]),t[x][i]=max(t[x][i],t[x][i-1]); return;51

}5253 il void

work()

5960

intmain()

BZOJ4813 Cqoi2017 小Q的棋盤

找以起點為起點的乙個最長鏈,最優一定是在最長鏈上不走回頭路的,所以相當於最長鏈上的邊代價是1,非最長鏈的邊代價是2 因為要走回去 每付出一次代價就可以使訪問到的點數 1,那麼貪心即可 include include include include include include include in...

BZOJ4813 Cqoi2017 小Q的棋盤

給出一棵樹,從根節點出發,走n步,求最多能經過多少個點 重複經過不算 貪心本來想著樹形dp,太麻煩了,懶得碼 首先我們把最長鏈留到最後走,這樣子我們就可以一次性將最長鏈走完了,那麼最長鏈的每條邊的代價就是1 而其它邊的代價就為2 因為要往回走 然後貪心就好了 特殊情況 1.最長鏈的長度 步數,直接輸...

bzoj4813 樹形dp 小Q的棋盤

description 小q正在設計一種棋類遊戲。在小q設計的遊戲中,棋子可以放在棋盤上的格點中。某些格點之間有連線,棋子只能 在有連線的格點之間移動。整個棋盤上共有v個格點,編號為0,1,2 v 1,它們是連通的,也就是說棋子從任意格 點出發,總能到達所有的格點。小q在設計棋盤時,還保證棋子從乙個...