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 入門水題 每個節點有權值,子節點和父節點不能同時選,問最後能選的最...