(树形DP)tree of tree (zju)
2014-12-17 10:26
447 查看
题意,一棵树中有N个结点(最多为100个结点)。每个结点有一个树值
求该树的子树结点最多为K个的所有权值和最大是多少。
思路:用dp[cur][K]记录包含当前结点与其子树所形成的子树的最大值。
求该树的子树结点最多为K个的所有权值和最大是多少。
思路:用dp[cur][K]记录包含当前结点与其子树所形成的子树的最大值。
#include<cstdio> #include<iostream> #include<cstring> #include<queue> #include<string> #include<vector> #include<cmath> #include<algorithm> using namespace std; const int N = 100; int n,m; vector<int> v ; long long dp ,num ,w ; void dfs(int cur,int pre) { //cout<<cur<<' '<<pre<<endl; for (int i=2;i<=m;i++) dp[cur][i]=0; dp[cur][1]=w[cur]; for (int i=0,len=v[cur].size();i<len;i++) if (v[cur][i]!=pre) { int son=v[cur][i]; //cout<<son<<endl; dfs(son,cur); for (int j=m-1;j;j--) { for (int k=j+1;k<=m;k++) { if (dp[son][k-j] == 0) break; dp[cur][k]=max(dp[cur][k],dp[cur][j]+dp[son][k-j]); } } } } int main() { freopen("in","r",stdin); while (cin>>n>>m) { // cout<<n<<' '<<m<<endl; for (int i=0;i<n;i++) { scanf("%lld",w+i); v[i].clear(); num[i]=0; } for (int i=1;i<n;i++) { int a,b; scanf("%d%d",&a,&b); v[a].push_back(b); v[b].push_back(a); } dfs(0,-1); long long ans=0; for (int i=0;i<n;i++) ans=max(ans,dp[i][m]); printf("%lld\n",ans); } }
相关文章推荐
- Zoj3201 Tree of Tree 树形DP
- ZOJ - 3201 Tree of Tree 树形DP
- ZOJ3201 Tree of Tree 【树形dp】
- zoj 3201 Tree of Tree 树形DP
- 树形DP专辑-ZOJ3201(Tree of Tree)
- ZOJ 3201 Tree of Tree 树形DP
- ZOJ-3201 Tree of Tree 树形DP
- CF 274B Zero Tree 树形DP
- CF 274 B Zero Tree(树形dp)
- hdoj 5834 Magic boy Bi Luo with his excited tree 树形dp
- Bestcoder round #65 && hdu 5593 ZYB's Tree 树形dp
- hdoj 4863 Centroid of a Tree【树的重心+树形dp+数据结构】
- Codeforces Round #358 (Div. 2)-C. Alyona and the Tree(树形dp)
- codeforces 161D D. Distance in Tree(树形dp)
- zoj 3201 简单树形dp Tree of Tree
- hdu 3534 Tree(树形dp)
- poj 1848 Tree(树形DP,太难了,三种状态,四种状态转换)
- HDOJ树形DP专题之Tree of Tree
- [codeforces161D]Distance in Tree(点分治/树形dp)
- CF618D:Hamiltonian Spanning Tree(贪心 & 树形dp & 最小路径覆盖)