树形dp
firstorloser
这个作者很懒,什么都没留下…
展开
-
poj 2486 Apple Tree (树形dp)
定义dp[u][j][1]表示在以u为根的子树中走了j步并返回了u点所能获得的最大的价值,dp[u][j][0]表示在以u为根的子树中走了j步但没有返回u点所能获得的最大价值。 #include #include #include #include #include #define N 105 using namespace std; int n,k,weight[N],dp[N][原创 2015-03-31 15:54:11 · 235 阅读 · 0 评论 -
zoj 3506 Cut the Tree (树形dp)
这道题细节很多,调了很长时间,设mx[u][j]表示以u为根的子树,切j刀后,这颗子树中与u连通的所有节点的最大权值,包括u。考虑每颗子树的决策,要么切掉,要么连上。 附用例: 4 1 -3 -2 1 1 1 2 2 3 1 44 2 -3 -2 1 1 1 2 2 3 1 45 2 1 2 3 4 5 1 2 2 3 3 4 4 56 2 -3 1 -2 3 4 0原创 2015-03-30 22:46:53 · 240 阅读 · 0 评论 -
hdu 3593 The most powerful force (树形dp+背包)
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define N 100005 using namespace std;int n,g,c[N],val[N],dp[505][10005]; vector<int>edge[N];void dfs(int u,int vol) { in原创 2015-03-29 23:12:18 · 308 阅读 · 0 评论 -
hdu 1561 The more, The Better (树形dp+背包)
设dp[u][j]为以u为根的子树,选取了j个点所能取得的最大价值,状态转移方程dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]) #include #include #include #include #include using namespace std; vectoredge[205]; int w[205],dp[205][205],sum原创 2015-03-25 19:52:09 · 232 阅读 · 0 评论 -
poj 1192 最优连通子集 (树形dp)
设dp[u][0]为以u为根的子树,子集中没有u的最大权值,dp[u][1]则表示子集中有u。 如果子集中没有u,那么u的所有儿子中只能选一个。 如果子集中有u,那么u的所有儿子要么不选,要么必须在子集中。 状态转移方程 dp[u][0]=max(dp[u][0],max(dp[v][0],dp[v][1])); dp[u][1]+=max(0,dp[v][1]); v是u的儿子节点#i原创 2015-03-28 16:45:53 · 270 阅读 · 0 评论 -
hdu 1011 Starship Troopers (树形dp+背包)
树形dp加泛化背包,状态转移方程dp[u][j]=max(dp[u][j],dp[v][k]+dp[u][j-k]),有很多细节需要注意,叶子节点就算没有bug也要留人,还有m=0的特殊情况。#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define N 105原创 2015-03-28 15:56:55 · 286 阅读 · 0 评论 -
poj 1655 Balancing Act (树形dp)
对于每个节点,它的balance要么来自于父亲节点,要么来自于儿子节点。 定义dp[u]为节点u的balance,sum[u]为以u为根的子树的节点个数,n为总共的节点个数。 如果来自于父亲节点,则dp[u]=n-sum[u]; 如果来自于儿子节点,则dp[u]=sum[v];#include<cstdio> #include<cstring> #include<algorithm> #inc原创 2015-03-28 17:34:42 · 252 阅读 · 0 评论 -
poj 1947 Rebuilding Roads (树形dp+背包)
定义dp[u][j]为以u为根的子树,形成含有j个点的独立的子树所需要切的最少的边。 对于每个节点,考虑它的每个儿子是否要切掉,初始时dp[u][1]=0,这时还没有考虑任何的儿子节点,所以不用切边。 然后依次考虑每个儿子节点,若该儿子节点要切掉,则dp[u][j]++,否则dp[u][j]=dp[v][k]+dp[u][j-k] #include #include #include原创 2015-03-24 18:46:28 · 253 阅读 · 0 评论