树形DP我只知道千万别写森林转二叉树慢的要死

没有上司的舞会 水!裸!

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; struct node
{
int x,y,next;
}a[];int len,last[];
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
} int f[][],h[];
void treedp(int x)
{
f[x][]=;f[x][]=h[x];
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
treedp(y);
f[x][]+=max(f[y][],f[y][]);
f[x][]+=f[y][];
}
} int fa[];
int main()
{
int n,x,y;
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&h[i]);
for(int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
ins(y,x);fa[x]=y;
} int rt;
for(int i=;i<=n;i++)
if(fa[i]==)rt=i;
treedp(rt);
printf("%d\n",max(f[rt][],f[rt][]));
return ;
}

没有上司的舞会

选课 带个背包咯,注意一下背包别重复用一个子节点就好

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; struct node
{
int x,y,next;
}a[];int len,last[];
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
} int f[][],h[],tot[];
void treedp(int x)
{
f[x][]=h[x];tot[x]=;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
treedp(y);
for(int i=tot[x];i>=;i--)
for(int j=tot[y];j>=;j--)
f[x][i+j]=max(f[x][i+j],f[x][i]+f[y][j]);
tot[x]+=tot[y];
}
} int fa[];
int main()
{
int n,m,x,y;
scanf("%d%d",&n,&m);
h[]=;
for(int i=;i<=n;i++)
{
scanf("%d%d",&fa[i],&h[i]);
ins(fa[i],i);
}
memset(f,-,sizeof(f));
treedp();
printf("%d\n",f[][m+]);
return ;
}

选课

poj3585 这题还挺有意思哈,书上说这是“不定根”的树形DP问题,有个很高大上的名词叫二次扫描与换根法

其实自己YY一下,设1为根,第一次dfs把每个点管辖的子树的流量d算出来,对于一个点其实它的流量就是这个d值+从父节点流出去的流量,画个图还是很好解决的,就是min(到父节点的边权,父节点的d值-当前点给父节点的贡献)

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; struct node
{
int x,y,c,next;
}a[];int len,last[];
void ins(int x,int y,int c)
{
len++;
a[len].x=x;a[len].y=y;a[len].c=c;
a[len].next=last[x];last[x]=len;
} bool checkleaf(int x,int fr)
{
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y!=fr)return false;
}
return true;
} int d[];
void dfs(int x,int fr)
{
d[x]=;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y!=fr)
{
dfs(y,x);
if(checkleaf(y,x)==true)d[x]+=a[k].c;
else d[x]+=min(a[k].c,d[y]);
}
}
}
int mmax;
void solve(int x,int fr,int rd)
{
mmax=max(mmax,d[x]+rd);
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y!=fr)
{
int g;
if(checkleaf(y,x)==true)g=d[x]-a[k].c;
else g=d[x]-min(a[k].c,d[y]); if(checkleaf(x,y)==true)solve(y,x,a[k].c);
else solve(y,x,min(rd+g,a[k].c));
}
}
} int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
int n,x,y,c;
scanf("%d",&n);
len=;memset(last,,sizeof(last));
for(int i=;i<n;i++)
{
scanf("%d%d%d",&x,&y,&c);
ins(x,y,c);ins(y,x,c);
}
dfs(,);
mmax=;solve(,,);
printf("%d\n",mmax);
}
return ;
}

poj3585

0x54 树形DP的更多相关文章

  1. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  2. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  3. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  4. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  5. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  6. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  7. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

  8. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...

  9. bzoj2500: 幸福的道路(树形dp+单调队列)

    好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...

随机推荐

  1. 记录一个MySQL的问题

    昨天做asp.net mvc程序,用mysql.data.entity.ef6做数据连接. 程序都是正常的,但就是提交数据的时候总是提示 Specified key was too long; max ...

  2. Android 权限管理(持续整理)

    1. Android 6.0之后,APP可以直接安装,运行时再询问用户授予相关权限,此时系统弹出一个对话框,(这个对话框不能由开发者定制) 同时用户也可以在手机的“设置”中对于某个App进行权限管理 ...

  3. windows下react-native搭建环境

    第一步:安装Java 1.下载JDK,选择适应自己的机型:官网地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downl ...

  4. 使用Ajax验证用户名

    Ajax是一项很重要的技术,下面简要举个例子,来解释如何使用Ajax.步骤如下:使用Ajax验证用户名使用文本框的onBlur事件 使用Ajax技术实现异步交互创建XMLHttpRequest对象通过 ...

  5. IT狂人职场路:揭秘华为百度高管如何炼成?

    原文链接:http://www.hdeso.com/waibao/detail.asp?id=45660 原文链接:http://tech.hexun.com/2014-02-18/162264716 ...

  6. 【Bootstrap】如何让响应式图片(img-responsive)水平居中

    我们在用bootstrap排版内容的时候,有的时候在内容中需要图片水平居中对齐. 一般情况下,我们的图片都使用了 .img-responsive 类来实现响应式图片.如果需要实现响应式图片水平居中,那 ...

  7. 【sqli-labs】 less16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/时间延迟的双引号POST型盲注)

    ' or 1=1# -->失败 1" or 1=1# -->失败 1') or 1=1# -->失败 1") or 1=1# -->成功 判断为双引号变形注 ...

  8. logger日志

    Level 描述 ALL 各级包括自定义级别 DEBUG 指定细粒度信息事件是最有用的应用程序调试 ERROR 错误事件可能仍然允许应用程序继续运行 FATAL 指定非常严重的错误事件,这可能导致应用 ...

  9. TestNg学习一

    简介 TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit,   功能都差不多, 只是功能更加强大,使用也更方便 Java中已经有一个JUnit的测试框架了.  TestNG比JU ...

  10. mysql的安装和下载

    1.MySQL下载后的文件名为:mysql_installer_community_V5.6.21.1_setup.1418020972.msi,示意图如下:  mysql下载地址: 链接:https ...