幾個樹形dp

2022-09-19 08:24:09 字數 1435 閱讀 9459

1.重建道路

樹形dp基礎題,f[i][j]表示在i這個點我和我的子樹聯通塊大小為j最少砍幾條邊。  

轉移的時候,到下乙個子樹時上乙個子樹所有答案先++(此樹直接砍掉不貢獻答案),再繼續dp。

注意更新答案時,如果不是跟答案還有+1(砍掉我和我父親的),不然洛谷會掛四個點qaq

馬上就noip了我還只能做這種水題qaq 還掛

//twenty

#include#include#include#include#include#include#include#include#includetypedef long long ll;

using namespace std;

const int n=201;

int ans,dp[n][n],n,p;

templatevoid read(t &x)

int ecnt,fir[n],nxt[n<<1],to[n<<1];

void add(int u,int v)

void dfs(int x,int fa)

int ecnt,fir[maxn],nxt[maxn],to[maxn],ans;

void add(int u,int v)

void dfs(int x)

ans=max(ans,dp[x][m]);

}void work()

void init()

}int main()

3.p2015 二叉蘋果樹

又是樹形dp水題。。

跟上面兩個沒啥差,還是最簡單的。沒啥可說了。

好水呀。。

//twenty

#include#include#include#include#include#include#include#include#includetypedef long long ll;

using namespace std;

const int maxn=100;

int n,m,dp[maxn][maxn];

templatevoid read(t &x)

int ecnt,fir[maxn],nxt[maxn<<1],to[maxn<<1],val[maxn<<1],ans;

void add(int u,int v,int w)

void dfs(int x,int fa)

int ecnt,fir[maxn],nxt[maxn],to[maxn],sz[maxn];

void add(int u,int v)

void dfs(int x,double now)

sz[x]+=sz[y]; }}

void work()

printf("%.3lf\n",l);

}void init()

}int main()

樹形DP 樹形DP四例

是時候練一下dp了!我的題單 portkey f u,if fu,i 表示以u uu為根節點的子樹中保留i ii條樹枝的最大蘋果數 f u,i max f max f fu,i max這些題是菜,但也不能輕視啊!include using namespace std define in read i...

HLOJ 樹形DP前置 DFS(樹形DP入門)

給定一棵 n nn 個點的樹,根為 t tt求每個點的父親是哪個點,t tt 的父親輸出 0 00第一行兩個整數 n,t n,tn,t接下來 n 1 n 1n 1 行,每行兩個整數 x,y x,yx,y,表示 x,y x,yx,y 之間有一條邊 n nn 行,第 i ii 行乙個整數,表示 i ii...

樹形dp小結

這些天做了一些樹形dp的題目,感覺有了些領悟,尤其是理解到樹形揹包就是分組揹包之後。選出幾道不錯的總結一下 hdu 1520 hdu 4003 poj 1155 poj 2486 hdu 4313 hdu 4340 hdu 1520 入門水題 每個節點有權值,子節點和父節點不能同時選,問最後能選的最...