Ural 1018. A Binary Apple Tree
2010-11-24 21:15
134 查看
这道题,可以马上看出是树形Dp,f[i,j]表示以i为根的子树(还包括 [i与 i的父亲] 这条边)内,保存j条边最多可以有多少苹果,显然f[i,j]=max(f[left[i],k]+f[right[i],j-k-1])+apple[i];输出的结果是f[1][q+1],q+1是因为根节点还多了一个虚拟的边。还有,因为输入数据没告诉谁是父节点谁是子节点,要建成无向图。
#include <iostream> #include <cstdio> #include <cstring> #define maxn 102 using namespace std; int tree[maxn][maxn],f[maxn][maxn],deg[maxn],n,q; void init() { memset(tree,0,sizeof(tree)); memset(f,0,sizeof(f)); memset(deg,0,sizeof(deg)); } void addedge(int a,int b,int c) { tree[a][b]=c; tree[b][a]=c; deg[a]++; deg[b]++; } void dfs(int s,int fa) { if(deg[s]==1) { for(int i=1; i<=q; ++i) f[s][i]=tree[fa][s]; return; } int l=0,r=0; for(int i=1; i<=n; ++i) { if(tree[s][i]&&i!=fa) { if(!l) l=i; else r=i; } } dfs(l,s); dfs(r,s); for(int i=1; i<=q; ++i) { for(int k=0; k<i; ++k) { if(f[l][k]+f[r][i-1-k]>f[s][i]) f[s][i]=f[l][k]+f[r][i-1-k]; } f[s][i]+=tree[fa][s]; } } int main(void) { int a,b,c; while(scanf("%d%d",&n,&q)!=EOF) { init(); q++; for(int i=0; i<n-1; ++i) { scanf("%d%d%d",&a,&b,&c); addedge(a,b,c); } dfs(1,0); // for(int i=0;i<=n;++i) // { // for(int j=0;j<=n;++j) // { // cout<<f[j][i]<<" "; // } // cout<<endl; // } printf("%d/n",f[1][q]); } return 0; }
相关文章推荐
- URAL 2014 Zhenya moves from parents 线段树
- ural 2018. The Debut Album 滚动数组dp
- BZOJ1397 Ural 1486 Equal squares
- URAL 1057 Amount of Degrees (数位DP)
- URAL 2000. Grand Theft Array V(贪心啊)
- URAL 1005 Stone Pile
- URAL 1820 Ural Steaks (贪心)
- URAL 1209. 1, 10, 100, 1000... (规律 + 二分)
- URAL 1298. Knight(DFS啊 )
- URAL 1110. Power
- URAL 1196. History Exam (二分)
- URAL 1731. Dill(数学啊 )
- URAL 1825. Ifrit Bomber 2 两圆的面积并
- POJ 2366 (URAL 1021)Sacrament of the Sum
- URAL - 1586 Threeprime Numbers
- 【状压】 URAL 1500 Pass Licenses
- URAL 1057 数位DP
- URAL_1789_Searching for the Dodecahedron_机智
- ural 1225 Flags
- 递推DP URAL 1119 Metro