URAL 1018 binary apple tree
2016-09-28 16:20
337 查看
有一棵苹果树,苹果树的是一棵二叉树,共N个节点,树节点编号为1~N,编号为1的节点为树根,边可理解为树的分枝,每个分支都长着若干个苹果,现在要要求减去若干个分支,保留M个分支,要求这M个分支的苹果数量最多。
【分析】
树形dp
【代码】
【分析】
树形dp
【代码】
//URAL 1018 binary apple tree #include<iostream> #include<cstdlib> #include<vector> #include<cstdio> #include<cstring> #include<algorithm> #define M(a) memset(a,0,sizeof a) #define fo(i,j,k) for(i=j;i<=k;i++) using namespace std; const int mxn=105; vector <int> f[mxn],w[mxn]; int n,m; int dp[mxn][mxn]; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline int dfs(int u,int fa) { int ans=0,i,j,x=f[u].size()-1,v,l; fo(i,0,x) { v=f[u][i]; if(v!=fa) { ans+=dfs(v,u)+1; for(j=ans;j;j--) for(l=j;l;l--) dp[u][j]=max(dp[u][j],dp[v][j-l]+dp[u][l-1]+w[u][i]); } } return ans; } int main() { int i,j,u,v,d; n=read(),m=read(); fo(i,1,n-1) { u=read();v=read();d=read(); f[u].push_back(v); w[u].push_back(d); f[v].push_back(u); w[v].push_back(d); } dfs(1,0); printf("%d\n",dp[1][m]); return 0; }
相关文章推荐
- ural 1018 Binary Apple Tree 树形dp
- URAL 1018. Binary Apple Tree
- Ural-1018 Binary Apple Tree(树形dp+分组背包)
- Ural 1018 Binary Apple Tree (树形dp)
- Binary Apple Tree_ural1018_树状dp
- Ural 1018 Binary Apple Tree (树形DP)
- 简单树形动态规划(Ural 1018 Binary Apple Tree)
- URAL 1018 Binary Apple Tree
- 【URAL 1018】Binary Apple Tree
- [ural 1018]Binary Apple Tree[树DP]
- URAL 1018 Binary Apple Tree 简单树形背包
- ural 1018-Binary Apple Tree【树状DP】
- Ural 1018 Binary Apple Tree 树形dp
- ural 1018 binary apple tree
- URAL 1018 Binary Apple Tree(树形dp入门题)
- Ural-1018-Binary Apple Tree
- URAL 1018 Binary Apple Tree(树DP)
- ural 1018 Binary Apple Tree
- URAL 1018 Binary Apple Tree (树形DP)
- ural 1018 Binary Apple Tree(树dp)