二叉

多叉

有一棵苹果树,如果树枝有分叉,可以是分多叉,分叉数k>=0(就是说儿子的结点数大于等于0)这棵树共有N个结点(叶子点或者树枝分叉点),编号为1~N,树根编号一定是1。我们用一根树枝两端连接的结点的编号来描述一根树枝的位置 。

数据规模:

对于20%的数据,满足1 <= n <=15。

对于40%的数据,满足1 <= n <=100。

对于100%的数据,满足1 <= n <=310,c<=2^31-1。

两道树形DP题,一样的代码改下细节就能过,令f[x][y]表示以x为根的子树保留y条边最多苹果数,易得出状态转移方程

f[x][[t]=max(f[x][t] , f[x][t-j-1] + f[y][j]+edge[i])

其中y是x的子节点,edge[i]表示x->y这条边上的苹果树,用f[x][t-j-1]而不是f[x][t-j]是因为我们还要保留x->y这条边,最后01背包倒序枚举即可。

二叉苹果树代码

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=110;
int n,q,f[maxn][maxn];
int head[maxn],Next[2*maxn],ver[2*maxn],edge[2*maxn],tot,u,v,z;
void add(int x,int y,int z){
ver[++tot]=y;edge[tot]=z;Next[tot]=head[x];head[x]=tot;
}
void dp(int x,int fa){
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==fa) continue;
dp(y,x);
for(int t=q;t>=1;--t){
for(int j=t-1;j>=0;--j){
f[x][t]=max(f[x][t],f[x][t-j-1]+f[y][j]+edge[i]);
}
}
}
}
int main(){
scanf("%d %d",&n,&q);
for(int i=1;i<n;++i){
scanf("%d %d %d",&u,&v,&z);
add(u,v,z);
add(v,u,z);
}
dp(1,0);
printf("%d",f[1][q]);
return 0;
}

多叉苹果树代码

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=330;
int n,q;
long long f[maxn][maxn];
int head[maxn],Next[2*maxn],ver[2*maxn],edge[2*maxn],tot,u,v,z;
void add(int x,int y,int z){
ver[++tot]=y;edge[tot]=z;Next[tot]=head[x];head[x]=tot;
}
void dp(int x,int fa){
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==fa) continue;
dp(y,x);
for(int t=q;t>=1;--t){
for(int j=t-1;j>=0;--j){
f[x][t]=max(f[x][t],f[x][t-j-1]+f[y][j]+(long long)edge[i]);
}
}
}
}
int main(){
scanf("%d %d",&n,&q);
for(int i=1;i<n;++i){
scanf("%d %d %d",&u,&v,&z);
add(u,v,z);
add(v,u,z);
}
dp(1,0);
printf("%lld",f[1][q]);
return 0;
}

最新文章

  1. 父元素相对定位后,子元素在ie下被覆盖的问题!
  2. 【zepto学习笔记02】零碎点
  3. ssh远程连接ubuntu
  4. android的adb详解(多设备时adb调用)
  5. Android(java)学习笔记136:Java类初始化顺序
  6. openerp import l field size limit
  7. angular2 学习笔记 ( Http 请求)
  8. iOS-swift-基础篇1
  9. 转:深入Java集合学习系列:HashMap的实现原理
  10. android 小项目------黑名单app
  11. PDF转图片工具
  12. mysql 聚集索引和非聚集索引问题(整理)
  13. 分析轮子(九)- Cloneable.java
  14. 多线程之批量插入小demo
  15. Mysql优化要点
  16. js 验证码倒计时
  17. 模拟的confirm
  18. 生成验证码程序C#
  19. 浏览器缓存和Service Worker
  20. 【[HNOI2015]亚瑟王】

热门文章

  1. python中的赋值操作与C语言中的赋值操作中的巨大差别
  2. Handler 使用详解
  3. JavaFX OnMouseClick
  4. 第二十二章 跳出循环-shift参数左移-函数的使用 随堂笔记
  5. spring-boot 示例大全
  6. git基本命令学习(一)
  7. 2019最新最全Java开发面试常见问题答案总结
  8. android 编译突然出错,错误原因 Could not resolve com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+.
  9. 大白话5分钟带你走进人工智能-第32节集成学习之最通俗理解XGBoost原理和过程
  10. (三十三)c#Winform自定义控件-日期控件