是時候練一下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()
int in
const
int n=
1e5+5;
int n,q,val[n]
,f[500][
500]
;int tot,first[n]
,nxt[n<<1]
,aim[n<<1]
,wei[n<<1]
;int siz[n]
;void
ljb(
int u,
int v,
int w)
void
dfs(
int u,
int fa)
return;}
intmain()
dfs(1,
0);printf
("%d\n"
,f[1
][q]);
return0;
}
portkey
揹包型樹形dp
有一種方法「左兒子右兄弟」不推薦
分組揹包解決
#include
using
namespace std;
#define in read()
int in
const
int n=
3e3+5;
int n,m,son[n]
[n],num[n]
;int wei[n]
[n],val[n]
;int f[n]
[n],siz[n]
;int t[n]
;int
dfs(
int u)
int sum=0;
for(
int e=
1;e<=num[u]
;++e)
return sum;
}int
main()
}for
(int i=n-m+
1;i<=n;
++i)
val[i]
=in;
memset
(f,128
,sizeof f)
;for
(int i=
1;i<=n;
++i)
f[i][0
]=0;
dfs(1)
;for
(int i=m;i>0;
--i)
}return0;
}
portkey
菜題
#include
using
namespace std;
#define in read()
int in
const
int n=
1e5+5;
int n,a[n]
,sum[n]
,fa[n]
,dp[n]
,ans;
int tot,first[n]
,nxt[n<<1]
,aim[n<<1]
;void
ljb(
int u,
int v)
//void get_father(int u,int f)
// return;
//}void
dfs(
int u,
int f)
ans=
max(ans,dp[u]);
return;}
intmain()
// get_father(1,0);
dfs(1,
0);printf
("%d"
,ans)
;return0;
}
portkey
經典菜題
#include
using
namespace std;
#define in read()
int in
const
int n=
1e3+5;
int n,m,w[n]
,f[n]
[n],siz[n]
;vector<
int>g[n]
;void
dfs(
int u)
siz[u]
+=siz[v];}
return;}
intmain()
dfs(0)
; cout<[m]
}
剩下兩道題不想做了 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 入門水題 每個節點有權值,子節點和父節點不能同時選,問最後能選的最...
樹形dp總結
from 列出一些經典問題吧 1 給出一棵樹 每個節點有權值 要求父節點和子節點不能同時取 求能夠取得的最大值 hdu1520 2 給出一棵樹,求離每個節點最遠的點的距離 hdu2196 3 1 在乙個地圖上,有n座城堡,每座城堡都有一定的寶物,在每次遊戲中允許攻克m個城堡並獲得裡面的寶物。但由於地...